在android联系人提供商中更新联系人图像

在android联系人提供商中更新联系人图像,android,android-contentprovider,android-contacts,Android,Android Contentprovider,Android Contacts,我创建一个应用程序来读取、更新、删除联系人详细信息。 更新联系人图片时出现问题 当设备在应用程序之外添加新联系人时,没有图像。 那么我们就不能更新联系人的图片了。 我的更新代码是 ops.add(ContentProviderOperation.newUpdate(Data.CONTENT_URI) .withSelection(Data.CONTACT_ID+"= ? AND "+ContactsContract.Data.MIMETYPE+"=?",n

我创建一个应用程序来读取、更新、删除联系人详细信息。 更新联系人图片时出现问题

当设备在应用程序之外添加新联系人时,没有图像。 那么我们就不能更新联系人的图片了。 我的更新代码是

    ops.add(ContentProviderOperation.newUpdate(Data.CONTENT_URI)
                .withSelection(Data.CONTACT_ID+"= ? AND "+ContactsContract.Data.MIMETYPE+"=?",new String[]{id,ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE})
                .withValue(ContactsContract.CommonDataKinds.Photo.PHOTO, imageInByte)
                .build());

请提供这方面的解决方案。

您将使用不同的代码更新照片,然后将照片添加到没有照片的联系人。根据您上面的描述,我相信您正在尝试插入图像而不是更新图像,但以下是这两种情况的代码:

        if(hasPhoto(resolver, id) == true)
        {
            int photoRow = -1;
            String where = ContactsContract.Data.RAW_CONTACT_ID + " = " + id + " AND " + ContactsContract.Data.MIMETYPE + " =='" + ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE + "'"; 
            Cursor cursor = resolver.query(ContactsContract.Data.CONTENT_URI, null, where, null, null);
            int idIdx = cursor.getColumnIndexOrThrow(ContactsContract.Data._ID);
            if (cursor.moveToFirst()) {
                photoRow = cursor.getInt(idIdx);
            }
            cursor.close();

            // Update current photo
            ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
            ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI)
                    .withSelection(ContactsContract.Data._ID + " = ?", new String[] {Integer.toString(photoRow)})
                    .withValue(ContactsContract.Data.RAW_CONTACT_ID, id)
                    .withValue(ContactsContract.Data.IS_SUPER_PRIMARY, 1)
                    .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE)
                    .withValue(ContactsContract.Data.DATA15, photoBytes)
                    .build());

            try {
                resolver.applyBatch(ContactsContract.AUTHORITY, ops);
            } catch (RemoteException e) {

            } catch (OperationApplicationException e) {
            // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        else
        {
            // Create new photo entry
            int rawContactId = -1;
            Cursor cursor = resolver.query(ContactsContract.RawContacts.CONTENT_URI, null, ContactsContract.RawContacts.CONTACT_ID + "=?", new String[] {id}, null);

            if(cursor.moveToFirst())
            {
                rawContactId = cursor.getInt(cursor.getColumnIndex(ContactsContract.RawContacts._ID));

                if(rawContactId > -1)
                {
                    ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
                    ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
                            .withValue(ContactsContract.Data.RAW_CONTACT_ID, rawContactId)
                            .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE)
                            .withValue(ContactsContract.CommonDataKinds.Photo.PHOTO, photoBytes)
                            .build());

                    try 
                    {
                        resolver.applyBatch(ContactsContract.AUTHORITY, ops);
                    } catch (RemoteException e) {

                    } catch (OperationApplicationException e) {
                    // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        }
if(hasPhoto(解析器,id)==true)
{
int photoRow=-1;
字符串,其中=contacts contract.Data.RAW_CONTACT_ID+“=”+ID+”和“+contacts contract.Data.MIMETYPE+”='“+contacts contract.commondatatypes.Photo.CONTENT_ITEM_TYPE+”;
Cursor Cursor=resolver.query(ContactsContract.Data.CONTENT\u URI,null,where,null,null);
int idIdx=cursor.getColumnIndexOrThrow(ContactsContract.Data.\u ID);
if(cursor.moveToFirst()){
photoRow=cursor.getInt(idIdx);
}
cursor.close();
//更新当前照片
ArrayList ops=新的ArrayList();
添加(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT\uURI)
.withSelection(contacts contract.Data._ID+“=?”,新字符串[]{Integer.toString(photoRow)})
.带值(contacts contract.Data.RAW\u CONTACT\u ID,ID)
.带值(contacts contract.Data.IS_SUPER_PRIMARY,1)
.withValue(contacts contract.Data.MIMETYPE、contacts contract.commondatatypes.Photo.CONTENT\u ITEM\u TYPE)
.带值(contacts contract.Data.DATA15,photoBytes)
.build());
试一试{
解析程序applyBatch(ContactsContract.AUTHORITY,ops);
}捕获(远程异常){
}捕获(操作应用程序异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
其他的
{
//创建新照片条目
int-rawContactId=-1;
Cursor Cursor=resolver.query(ContactsContract.RawContacts.CONTENT_URI,null,ContactsContract.RawContacts.CONTACT_ID+“=?”,新字符串[]{ID},null);
if(cursor.moveToFirst())
{
rawContactId=cursor.getInt(cursor.getColumnIndex(ContactsContract.RawContacts.\u ID));
如果(原始联系人ID>-1)
{
ArrayList ops=新的ArrayList();
添加(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT\uURI)
.带值(contacts contract.Data.RAW\u CONTACT\u ID,RAW contactid)
.withValue(contacts contract.Data.MIMETYPE、contacts contract.commondatatypes.Photo.CONTENT\u ITEM\u TYPE)
.withValue(ContactsContract.CommonDataTypes.Photo.Photo,photoBytes)
.build());
尝试
{
解析程序applyBatch(ContactsContract.AUTHORITY,ops);
}捕获(远程异常){
}捕获(操作应用程序异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
}
}
不同之处在于,如果要更新现有照片,则使用newUpdate功能;如果要将照片插入从未有过照片的联系人,则使用newInsert