Definir a imagem do livro de endereços para um contato não parece funcionar
-
21-09-2019 - |
Pergunta
Estou tentando definir a imagem de contato com o código abaixo. Não estou vendo erros e a imagem não é salva na entrada de contato no catálogo de endereços. Por favor ajude! Eu devo estar fazendo algo errado...
- (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;
}
Aqui está o meu log de saída:
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
Não sei por que o objeto de erro está logando como um objeto de abetopationervationController?
Solução
Em relação a Não sei por que o objeto de erro está logando como um objeto de abetopationervationController? - porque você não está inicializando adequadamente o error
aqui:
CFErrorRef error;
Atribuir nil
Aqui, ou terá um valor aleatório (ou mais precisamente, algum memória anterior), apontando incidentalmente para um ABPeoplePickerNavigationController
objeto.
Em relação aos méritos: você tem certeza da referência a person
Você passou para o seu método é válido no contexto do livro de endereços? Eu tentaria usar uma função como ABAddressBookGetPersonWithRecordID
Primeiro, em vez de passar ABPersonRef
está por perto e esperando que eles sejam válidos para diferentes referências ao livro de endereços.
Outras dicas
Toda essa resposta não funcionou. Você deve simplesmente alterar sua linha de código de:
ABAddressBookRef addressBook = ABAddressBookCreate();
para:
ABAddressBookRef addressBook = [peoplePicker addressBook];
Dessa forma, você obtém a referência ao "livro de endereços", "Pessoa" pertence.
Eu também tentei usar para definir a imagem (foto) da pessoa selecionada atual, mas ela exibe massagem para salvar com sucesso, mas na dose real não funciona !!!
Após a descoberta do código e os documentos fornecidos pelo Apple SDK, tenho um pouco com a solução a seguir.
Confira o código abaixo. Está realmente funcionando bem para mim e espero para você também.
- (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;
}
Eu verifiquei seu código e ele não funciona como deveria. Então eu fiz 2 alterações.
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);
Agora funciona como deveria.