Android联系人照片:如何从网上取回(Google)联系人图片(以及'取消'以前的本地图片更改)

时间:2014-01-28 15:33:06

标签: android contactscontract

我是唯一一个试图实现此目标的人......:/?


简而言之:

我想取回我的联系人的图片,因为他们自己定义了这些图片(例如,在他们自己的Google帐户页面上)。

使用案例:我自己修改了某个联系人的图片,现在,我想撤消该更改 - >我想“取回”Google联系人的图片(由他/她自己设置)。


我有一个管理Google通讯录的应用。它还使用

管理联系人照片

ContactsContract.CommonDataKinds.Photo.PHOTO

它工作正常。

以下是我想支持的方案:

  1. 我在联系人列表中添加了一个新联系人,输入了它的gmail地址。 (OK)
  2. 过了一段时间,我的联系人应用程序上可以找到联系人照片(因为联系人在其Google帐户上有一张图片,并且Android设备上的联系人同步已开启)。 (OK)
  3. 在我的应用程序中,我更改了应用联系人图片(所以,我'覆盖'联系人图片)(确定)
  4. 在我的应用中,我想要恢复默认的Google联系人图片:不行。我怎样才能实现这一目标?
  5. 请在此处查看我的代码以设置照片。 我应该“清除”照片并依赖于ContactProvider从Google帐户下载用户照片吗?

    如何清除照片。将ContactsContract.CommonDataKinds.Photo.PHOTO设置为'null'?并删除相关文件,即

    Uri rawContactPhotoUri = Uri.withAppendedPath(ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), RawContacts.DisplayPhoto.CONTENT_DIRECTORY)
    

    感谢您的帮助。

    以下是我更新图片的方式:

        private void updatePhotoThumbnail(Bitmap bitmap, Contact contact) throws Exception
        {
            byte[] contactPhotoBytes = getContactPhotoBytes(bitmap);
    
            ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
    
            // @formatter:off
            String where =     ContactsContract.RawContacts.ACCOUNT_NAME + "= ? "
                    + "AND " + ContactsContract.RawContacts.ACCOUNT_TYPE + "= ? "
                    + "AND " + ContactsContract.Data.CONTACT_ID + "= ? "
                    + "AND " + ContactsContract.Data.RAW_CONTACT_ID + "= ? "
                    + "AND " + ContactsContract.Data.MIMETYPE + " = ?";
            // @formatter:on
    
            String[] params = new String[]
            {
                    // @formatter:off
                    _accountName,
                    AccountManagerHelper.GOOGLE_ACCOUNT_TYPE,
                    String.valueOf(contact.getId()),
                    String.valueOf(contact.getRawContactId()),
                    ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE
                    // @formatter:on
            };
    
            ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI).withSelection(where, params)
                    .withValue(ContactsContract.Data.IS_SUPER_PRIMARY, 1)
                    .withValue(ContactsContract.CommonDataKinds.Photo.PHOTO, contactPhotoBytes).build());
    
            try
            {
                _contentResolver.applyBatch(ContactsContract.AUTHORITY, ops);
                updateDisplayPhoto(contact.getRawContactId(), contactPhotoBytes);
            }
            catch (RemoteException e)
            {
                e.printStackTrace();
                throw new Exception(e.getMessage());
            }
            catch (OperationApplicationException e)
            {
                e.printStackTrace();
                throw new Exception(e.getMessage());
            }
        }
    
    
        private void updateDisplayPhoto(long rawContactId, byte[] photo)
        {
            Uri rawContactPhotoUri = Uri.withAppendedPath(ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId),
                    RawContacts.DisplayPhoto.CONTENT_DIRECTORY);
            try
            {
                AssetFileDescriptor fd = getContentResolver().openAssetFileDescriptor(rawContactPhotoUri, "rw");
                OutputStream os = fd.createOutputStream();
                os.write(photo);
                os.close();
                fd.close();
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
        }
    

1 个答案:

答案 0 :(得分:1)

Here是一个检索用户Google个人资料图片的教程。它还检索一些其他的东西,如帐户电子邮件,名称,... 我认为这是你问题的直接方式:) 如果它成功,请保持联系。