Android Can';t更新或添加新联系人照片

Android Can';t更新或添加新联系人照片,android,contacts,android-contentprovider,android-contacts,android-contentresolver,Android,Contacts,Android Contentprovider,Android Contacts,Android Contentresolver,我不明白为什么它可以在模拟器上工作,但不能在真正的设备上工作 请帮忙 在这里,我通过电话号码获得联系人id ContentResolver crFull = context.getContentResolver(); Uri lookupUri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(PhoneNumberFormatter.GetOnlyNumbers(((Contact)recipi

我不明白为什么它可以在模拟器上工作,但不能在真正的设备上工作

请帮忙

在这里,我通过电话号码获得联系人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();
    }   
intphotorow=-1;
字符串,其中=contacts contract.Data.RAW_CONTACT_ID+“=”+ID+”和“+contacts contract.Data.MIMETYPE+”='“+contacts contract.commondatatypes.Photo.CONTENT_ITEM_TYPE+”;
Cursor cursorr=crFull.query(contacts contract.Data.CONTENT_URI,null,where,null,null);
int idIdx=cursorr.getColumnIndexOrThrow(contacts contract.Data.\u ID);
if(cursorr.moveToFirst()){
photoRow=cursorr.getInt(idIdx);
}
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,照片)
.build());
试一试{
crFull.applyBatch(联系合同管理局,ops);
}捕获(远程异常){
}捕获(操作应用程序异常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();
    }
ArrayList ops=new ArrayList();
添加(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT\uURI)
.带值(contacts contract.Data.RAW\u CONTACT\u ID,ID)
.withValue(contacts contract.Data.MIMETYPE、contacts contract.commondatatypes.Photo.CONTENT\u ITEM\u TYPE)
.带值(contacts contract.commondatacates.Photo.Photo,Photo)
.build());
尝试
{
crFull.applyBatch(联系合同管理局,ops);
}捕获(远程异常){
}捕获(操作应用程序异常e){
e、 printStackTrace();
}
更新和插入仅在Emulator上有效。如果我在真正的设备上启动它,则不会在图像中进行任何更新和插入。在真正的设备上,我也没有例外。 我做错了什么?

试试这个

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

你到底有什么问题?你有例外吗?结果不是如预期的那样吗?这两种方法(更新和插入)都不起作用吗?