Android 安卓联系人照片:如何从网上取回(谷歌)联系人照片(因此,取消以前的本地图片更改)

Android 安卓联系人照片:如何从网上取回(谷歌)联系人照片(因此,取消以前的本地图片更改),android,contactscontract,Android,Contactscontract,我是唯一一个试图实现这一目标的人吗…:/ 简而言之: 我想找回我的联系人的照片,就像他们自己定义的那样(比如在他们自己的谷歌账户页面上) 用例:我自己修改了联系人的一张照片,现在,我想撤销该更改->我想“取回”我联系人的谷歌照片(他/她自己设置的照片) 我有一个管理谷歌联系人的应用程序。它还使用 它工作得很好 下面是我想支持的一个场景: 我在联系人列表中添加了一个新联系人,并输入了它的gmail地址。(好的) 过了一会儿,我的联系人应用程序上就有了联系人照片(因为联系人的谷歌账户上有一张照

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


简而言之:

我想找回我的联系人的照片,就像他们自己定义的那样(比如在他们自己的谷歌账户页面上)

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


我有一个管理谷歌联系人的应用程序。它还使用

它工作得很好

下面是我想支持的一个场景:

  • 我在联系人列表中添加了一个新联系人,并输入了它的gmail地址。(好的)
  • 过了一会儿,我的联系人应用程序上就有了联系人照片(因为联系人的谷歌账户上有一张照片,并且联系人同步功能在Android设备上开启)。(好的)
  • 在我的应用程序中,我更改应用程序联系人图片(因此,我“覆盖”联系人图片)(确定)
  • 在我的应用程序中,我想恢复默认的谷歌联系人图片:不正常。我如何才能做到这一点?
  • 请看一下我在这里设置照片的代码。 我是否应该“清除”照片,并依靠ContactProvider从Google帐户下载用户照片

    我怎样才能清除照片。是否将ContactsContract.CommonDataTypes.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();
            }
        }
    
    private void updatephoto缩略图(位图、联系人)引发异常
    {
    字节[]contactPhotoBytes=getContactPhotoBytes(位图);
    ArrayList ops=新的ArrayList();
    //@formatter:off
    字符串,其中=contacts contract.raw contacts.ACCOUNT\u NAME+“=?”
    +“和”+contacts contract.raw contacts.ACCOUNT_TYPE+“=?”
    +“和”+contacts contract.Data.CONTACT_ID+“=?”
    +“和”+contacts contract.Data.RAW_CONTACT_ID+“=?”
    +“和”+contacts contract.Data.MIMETYPE+“=?”;
    //@formatter:on
    字符串[]参数=新字符串[]
    {
    //@formatter:off
    _帐户名,
    AccountManagerHelper.GOOGLE\u帐户\u类型,
    String.valueOf(contact.getId()),
    String.valueOf(contact.getRawContactId()),
    Contacts contract.CommonDataTypes.Photo.CONTENT\u ITEM\u TYPE
    //@formatter:on
    };
    add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI).with selection(其中,参数)
    .带值(contacts contract.Data.IS_SUPER_PRIMARY,1)
    .withValue(ContactsContract.CommonDataTypes.Photo.Photo,contactPhotoBytes).build());
    尝试
    {
    _contentResolver.applyBatch(contacts contract.AUTHORITY,ops);
    updateDisplayPhoto(contact.getRawContactId(),contactPhotoBytes);
    }
    捕获(远程异常)
    {
    e、 printStackTrace();
    抛出新异常(如getMessage());
    }
    捕获(操作应用程序异常e)
    {
    e、 printStackTrace();
    抛出新异常(如getMessage());
    }
    }
    私有void updateDisplayPhoto(长rawContactId,字节[]photo)
    {
    Uri rawContactPhotoUri=Uri.withAppendedPath(ContentUris.withAppendedId(RawContacts.CONTENT_Uri,rawContactId),
    rawscontacts.DisplayPhoto.CONTENT\u目录);
    尝试
    {
    AssetFileDescriptor fd=getContentResolver();
    OutputStream os=fd.createOutputStream();
    写作(照片);
    os.close();
    fd.close();
    }
    捕获(IOE异常)
    {
    e、 printStackTrace();
    }
    }
    
    是检索用户谷歌个人资料图片的教程。它还检索一些其他内容,如帐户电子邮件、姓名等。。。 我认为这是回答你问题的直接方法:)

    如果发生故障,请保持联系。

    否。它们存储在本地安卓数据库和我的谷歌账户联系人列表中。我想找回联系人的照片,这是由联系人自己定义的(比如在谷歌账户页面上),谢谢你的链接。这允许获取用户的图片。我想检索的是其他用户的Google图片列表,对应于用户的联系人列表(Google电子邮件地址)