更新 android 联系人提供程序中的联系人图片

Posted

技术标签:

【中文标题】更新 android 联系人提供程序中的联系人图片【英文标题】:Update contact image in android contact provider 【发布时间】:2013-01-14 02:29:34 【问题描述】:

我创建了一个应用程序来读取、更新、删除联系人详细信息。 这是更新 Contact_Image 的问题。

当没有图像的应用程序外部的设备添加了新联系人时。 那么我们无法更新联系人图片。 我的更新代码是。

    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());

请提供解决方案。

【问题讨论】:

【参考方案1】:

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

        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();
                    
                
            
        

不同之处在于,如果您要更新现有照片,则使用 newUpdate 功能,但如果您要向从未有过照片的联系人插入照片,则使用 newInsert

【讨论】:

以上是关于更新 android 联系人提供程序中的联系人图片的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式更新android中的联系人姓名和号码

如何从 Android 中的联系人列表中获取联系人?使用联系提供商

Android 内容提供商返回错误的联系人 ID

java - 如何使用json中提供的多个联系人数据在java中的android中添加新的电话联系人

无法删除 Android 联系人中的特定号码

Android - 获取联系人的 Facebook 图片