ABPersonSetImageData仅更改联系人缩略图而不是完整的图片

时间:2009-10-06 19:39:12

标签: iphone addressbook image

我正在尝试在每张联系人照片周围添加边框。我有工作代码来创建这个有边框的图像和工作代码,将其设置为联系人图像:

if (image) {
    NSData *dataRef = UIImagePNGRepresentation(image); 
    CFDataRef cfdata = CFDataCreate(NULL, [dataRef bytes], [dataRef length]);
    CFErrorRef error;
    ret = ABPersonSetImageData(person, cfdata, &error);
    if (ret) {
        ret = ABAddressBookSave(addressBook, &error);
    } else {
        DebugLog(@"Could not write the image to the person: %@", [error description]);
    }
    CFRelease(cfdata);
}

我看到的问题是,当在联系人或手机应用程序中查看时,边框图像在缩略图中正确显示,而来电显示的全屏图像则不是。

我原本以为它只是放大了一点,所以我尝试了边框大小。我确认边框在大镜头上根本没有显示。我错过了一些明显的东西吗?

<小时/> 编辑10/9/09 我一直在与Apple通信,这确实是地址簿框架中的一个错误。如果你正在阅读这篇文章,那么我建议你file a bug with Apple来帮助加快修复。

1 个答案:

答案 0 :(得分:7)

我想在这里回答我自己的问题,因为我认为我找出了问题所在。如果您的联系人还没有图像,则在使用ABPersonSetImageData时,将添加缩略图和全尺寸镜头。如果您的联系人已经有一个完整大小的图像,那么当您使用ABPersonSetImageData时,只会设置缩略图。

在意识到这一点之后,解决方案是明智之举。我只是在设置之前删除了图片。

if (image) {
    NSData *dataRef = UIImagePNGRepresentation(image); 
    CFDataRef cfdata = CFDataCreate(NULL, [dataRef bytes], [dataRef length]);
    CFErrorRef error;

    ABPersonRemoveImageData(person, &error); // <-- clean any image first from ref
    ABAddressBookSave(addressBook, &error);

    ret = ABPersonSetImageData(person, cfdata, &error);
    if (ret) {
        ret = ABAddressBookSave(addressBook, &error);
    } else {
        DebugLog(@"Could not write the image to the person");
    }
    CFRelease(cfdata);
}

注意*这会创建一个正方形版本的全尺寸图片。该过程裁剪图像的顶部和底部,并将其设置为320x320。但是,它正在发挥作用。

编辑10/9/09 我一直在与Apple通信,这确实是地址簿框架中的一个错误。如果你正在阅读这篇文章,那么我建议你file a bug with Apple来帮助加快修复。