連絡先のアドレス帳画像の設定が機能しないようです
-
21-09-2019 - |
質問
以下のコードで連絡先画像を設定しようとしています。エラーは表示されておらず、画像はアドレス帳の連絡先エントリに保存されていません。助けてください!私は何か間違ったことをしているに違いありません...
- (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;
}
これが私の出力ログです:
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
エラーオブジェクトがabpeoplepickernavigationControllerオブジェクトとしてログインしている理由はわかりませんか?
解決
それにかんする エラーオブジェクトがabpeoplepickernavigationControllerオブジェクトとしてログインしている理由はわかりませんか? - 適切に初期化していないからです error
ここ:
CFErrorRef error;
割当 nil
ここで、またはランダム(またはより正確には、以前のメモリ)値があり、偶然に ABPeoplePickerNavigationController
物体。
メリットに関して:あなたは確信していますか person
あなたはあなたの方法に渡されました、アドレス帳の文脈で有効ですか?次のような関数を使用しようとします ABAddressBookGetPersonWithRecordID
まず、通過する代わりに ABPersonRef
周囲に、それらが異なるアドレス帳参照に対して有効であることを期待しています。
他のヒント
これらの答えはすべてうまくいきませんでした。コードの行を単純に変更する必要があります。
ABAddressBookRef addressBook = ABAddressBookCreate();
に:
ABAddressBookRef addressBook = [peoplePicker addressBook];
このようにして、「アドレス帳」、「人」への参照を取得します。
また、現在の選択された人の画像(写真)を設定するために使用しようとしていますが、マッサージを表示して正常に保存しますが、実際には機能しません!!!
Apple SDKが提供するコードとドキュメントを掘り出した後、次のソリューションを使用しています。
以下のコードをチェックしてください。それは私にとって本当にうまく機能していて、あなたにも希望しています。
- (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;
}
私はあなたのコードをチェックしました、そしてそれはそれが必要なものではありません。だから私は2つの変更を加えました。
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);
今ではそれが想定されるように機能します。