Das Einstellen von Adressbuchbild für einen Kontakt scheint nicht zu funktionieren
-
21-09-2019 - |
Frage
Ich versuche das Kontaktbild mit dem folgenden Code festzulegen. Ich sehe keine Fehler, und das Bild wird nicht in der Kontakteingabe im Adressbuch gespeichert. Bitte helfen Sie! Ich muss etwas falsch machen ...
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person
{
[abcontroller setDisplayedPerson:person];
UIImage *im = [UIImage imageNamed:@"image1.jpg"];
NSData *dataRef = UIImagePNGRepresentation(im);
CFErrorRef error;
ABAddressBookRef addressBook = ABAddressBookCreate();
NSLog(@"Error:",error);
if (ABPersonSetImageData(person, (CFDataRef)dataRef, &error))
{
NSLog(@"Set contact photo %@", error);
if (ABAddressBookHasUnsavedChanges(addressBook))
{
NSLog(@"Changes made to address book");
}
else {
NSLog(@"No changes made to address book");
}
if (ABAddressBookSave(addressBook, &error))
{
NSLog(@"Saved");
}
else {
NSLog(@"Not saved");
}
}
else {
NSLog(@"Error saving contact photo %@", error);
}
ABAddressBookSave(addressBook, &error);
[self dismissModalViewControllerAnimated:YES];
return NO;
}
Hier ist mein Ausgabeprotokoll:
2010-01-17 21:58:35.465 Error:
2010-01-17 21:58:35.504 Set contact photo <ABPeoplePickerNavigationController: 0x19e9b0>
2010-01-17 21:58:43.497 No changes made to address book
2010-01-17 21:58:44.724 Saved
Ich bin mir nicht sicher, warum sich das Fehlerobjekt als ABPEoplepickernAvigationController -Objekt angemeldet hat?
Lösung
Bezüglich Ich bin mir nicht sicher, warum sich das Fehlerobjekt als ABPEoplepickernAvigationController -Objekt angemeldet hat? - Weil Sie die nicht richtig initialisieren error
hier:
CFErrorRef error;
Zuordnen nil
Hier oder es wird einen zufälligen (oder genaueren vorherigen Speicherwert) haben, der übrigens auf eine zeigt ABPeoplePickerNavigationController
Objekt.
In Bezug auf die Verdienste: Sind Sie sicher, dass der Verweis auf person
Sie sind an Ihre Methode übergeben, ist im Kontext des Adressbuchs gültig? Ich würde versuchen, eine Funktion wie zu verwenden, z. ABAddressBookGetPersonWithRecordID
Erstens anstatt zu bestehen ABPersonRef
s um und erwartet, dass sie für verschiedene Adressbuchreferenzen gültig sind.
Andere Tipps
All diese Antwort funktionierte nicht. Sie sollten einfach Ihre Codezeile ändern:
ABAddressBookRef addressBook = ABAddressBookCreate();
zu:
ABAddressBookRef addressBook = [peoplePicker addressBook];
Auf diese Weise erhalten Sie den Hinweis auf das "Adressbuch", "Person" gehört zu.
Ich habe auch versucht, das Bild (Foto) der aktuellen ausgewählten Person festzulegen, aber es zeigt eine Massage, um erfolgreich zu speichern, aber in realer IT -Dosis funktioniert nicht !!!
Nachdem das von Apple SDK bereitgestellte Code und die von Apple SDK bereitgestellten Dokumente ausgewählt wurden, habe ich einige mit der folgenden Lösung.
Bitte überprüfen Sie den folgenden Code. Es funktioniert wirklich gut für mich und hoffe auch für Sie.
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person
{
@try {
CFErrorRef cfError = nil;
if (ABPersonHasImageData(person)) {
NSLog(@"%s has an image", _cmd);
//theAlert = [[UIAlertView alloc] initWithTitle:@"Contact already has an image" message:@"Are you sure you want to overwrite it?" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Overwrite"];
//[theAlert show];
//[theAlert release];
//Note: We do not yet handle the answer to this question
}
// Just a sanity check
if ((nil == [imageView image])
|| (nil == UIImagePNGRepresentation([imageView image]))) {
NSLog(@"%s NIL STUFF", _cmd);
}
// Not sure I even need to create and save an address book
// Cf. https://devforums.apple.com/message/27512#27512
ABAddressBookRef libroDirec = ABAddressBookCreate();
ABPersonSetImageData(person, (CFDataRef) (UIImageJPEGRepresentation([imageView image], 1.0f)), &cfError);
ABAddressBookAddRecord(libroDirec, person, &cfError);
if (ABAddressBookSave(libroDirec, nil)) {
NSLog(@"%s saved successfuly", _cmd);
} else {
NSLog(@"%s something bad happen while saving", _cmd);
}
CFRelease(libroDirec);
}
@catch (NSException * e) {
}
@finally {
}
// TODO: release peoplePicker (and refactor code to not have it global)
[self dismissModalViewControllerAnimated:YES];
return NO;
}
Ich habe Ihren Code überprüft und es funktioniert nicht so, wie er sollte. Also habe ich 2 Änderungen vorgenommen.
ABAddressBookRef libroDirec = [peoplePicker addressBook];//don't create
ABPersonSetImageData(person, (CFDataRef)UIImagePNGRepresentation(display.image), &cfError);
ABAddressBookAddRecord(libroDirec, person, &cfError);
if (ABAddressBookSave(libroDirec, nil)) {
NSLog(@"\n%s saved successfuly", _cmd);
} else {
NSLog(@"\n%s something bad happen while saving", _cmd);
}
//CFRelease(libroDirec);
Jetzt funktioniert es so wie es soll.