Android 联系人照片:如何从网络上取回 (Google) 联系人图片(因此,“取消”以前的本地图片更改)

Posted

技术标签:

【中文标题】Android 联系人照片:如何从网络上取回 (Google) 联系人图片(因此,“取消”以前的本地图片更改)【英文标题】:Android contact photo: How to get back (Google) contact picture from the web (and so, 'cancel' a former local picture change) 【发布时间】:2014-02-20 00:07:12 【问题描述】:

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


简而言之:

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

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


我有一个管理 Google 通讯录的应用。它还使用管理联系人照片

ContactsContract.CommonDataKinds.Photo.PHOTO

而且它工作正常。

这是一个我想支持的场景:

    我在我的联系人列表中添加了一个新联系人,输入它的 gmail 地址。 (好的) 一段时间后,我的联系人应用程序上会显示联系人照片(因为联系人的 Google 帐户中有一张照片,并且 android 设备上的联系人同步已开启)。 (好的) 在我的应用程序中,我更改了应用程序的联系人图片(因此,我“覆盖”了联系人图片)(好的) 在我的应用程序中,我想取回默认的 Google 联系人图片:不行。我怎样才能做到这一点?

请在此处查看我的代码以设置照片。 我应该只是“清除”照片并依靠 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();
        
    

【问题讨论】:

不。它们存储在本地 Android 数据库和我的 Google 帐户联系人列表中。我想取回联系人自己定义的联系人图片(例如在其 Google 帐户页面上) 【参考方案1】:

Here 是一个检索用户谷歌头像的教程。它还检索其他一些东西,如帐户电子邮件、姓名、... 我认为这是解决您问题的直接方法:) 如果有帮助,请保持联系。

【讨论】:

感谢您的链接。这允许获取用户的图片。我要检索的是其他用户的列表谷歌图片,对应用户的联系人列表(谷歌电子邮件地址)

以上是关于Android 联系人照片:如何从网络上取回 (Google) 联系人图片(因此,“取消”以前的本地图片更改)的主要内容,如果未能解决你的问题,请参考以下文章

Android,如何获取 Facebook/Twitter/etc 联系人照片

android 上的外部(例如 facebook)联系人照片

将联系人的照片写入vcf文件,android

如何检测更新的android联系人并同步到firestore

如何使用 Android 将手机联系人照片的总列表上传到服务器?

如何通过 android 2.3.6 中的联系人提供者获取联系人照片?