无法更新或添加新的联系人照片 Android

Posted

技术标签:

【中文标题】无法更新或添加新的联系人照片 Android【英文标题】:Can't update or add new contact photo Android 【发布时间】:2013-03-30 12:19:42 【问题描述】:

我无法理解为什么它适用于仿真器,而不是真实的设备。

请帮忙!!!

我通过电话号码获得联系人ID

    ContentResolver crFull = context.getContentResolver(); 
    Uri lookupUri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(PhoneNumberFormatter.GetOnlyNumbers(((Contact)recipients.get(k)).GetContactPhoneNumber())));
    Cursor cursor = crFull.query(lookupUri, new String[]  ContactsContract.PhoneLookup._ID , null, null, null);
    long id = cursor.getLong(cursor.getColumnIndex(ContactsContract.PhoneLookup._ID));

在这里,我将从base64的新图像转换为

    String base64Image = json.getString("PhotoBase64");
    byte[] decodedString = Base64.decode(base64Image, Base64.DEFAULT);

    Bitmap bmp = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);
    ByteArrayOutputStream streamy = new ByteArrayOutputStream(); 
    bmp.compress(CompressFormat.JPEG, 100, streamy); 
    byte[] photo = streamy.toByteArray();

在这里我检查是否已联系已有图像

    Uri uri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, id);
    InputStream input = ContactsContract.Contacts.openContactPhotoInputStream(crFull, uri);

如果有

    int photoRow = -1;
    String where = ContactsContract.Data.RAW_CONTACT_ID + " = " + id + " AND " + ContactsContract.Data.MIMETYPE + " =='" + ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE + "'";
    Cursor cursorr = crFull.query(ContactsContract.Data.CONTENT_URI, null, where, null, null);
    int idIdx = cursorr.getColumnIndexOrThrow(ContactsContract.Data._ID);
    if (cursorr.moveToFirst()) 
        photoRow = cursorr.getInt(idIdx);
    

    ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
    ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI)
    .withSelection(ContactsContract.Data._ID + " == " + Integer.toString(photoRow), new String[] )
    .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, photo)
    .build());

    try 
            crFull.applyBatch(ContactsContract.AUTHORITY, ops);
     catch (RemoteException e) 

     catch (OperationApplicationException e) 
        e.printStackTrace();
       

如果没有

    ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
    ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
    .withValue(ContactsContract.Data.RAW_CONTACT_ID, id)
    .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE)
    .withValue(ContactsContract.CommonDataKinds.Photo.PHOTO, photo)
    .build());

    try 
    
        crFull.applyBatch(ContactsContract.AUTHORITY, ops);
     catch (RemoteException e) 

     catch (OperationApplicationException e) 
        e.printStackTrace();
    

更新和插入仅适用于模拟器。如果我在真实设备上启动它,那么没有更新和插入图像。同样在真实设备上我也没有例外。 我做错了什么?

【问题讨论】:

究竟是什么问题?你有例外吗?结果是不是和预期的不一样?这些方法都不是(更新以及插入)工作? span> 【参考方案1】:

试试这个...

Bitmap bitmap = ((BitmapDrawable) image.getDrawable())
                .getBitmap();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 80, baos);
byte[] b = baos.toByteArray();


ops.add(ContentProviderOperation
                            .newUpdate(
                                    ContactsContract.Data.CONTENT_URI)
                            .withSelection(
                                    ContactsContract.Data.CONTACT_ID
                                            + " = ? AND "
                                            + ContactsContract.Data.MIMETYPE
                                            + " = ?",
                                    new String[] 
                                            contactid,
                                            ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE )
                            .withValue(Photo.DATA15, b).build());

【讨论】:

以上是关于无法更新或添加新的联系人照片 Android的主要内容,如果未能解决你的问题,请参考以下文章

无法将图像文件添加到新的照片场景 [autodesk-forge] API Reality Capture

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

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

android手机,新建联系人在通讯录无法显示。

Android:仅获取更新和删除的联系人

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