0

我不明白爲什麼它在模擬器上工作,但不在真實設備上。無法更新或添加新的聯繫人照片Android

請幫忙!!!

在這裏,我的電話號碼,讓接觸式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(); 
    } 

更新和插入工作只能在模擬器。如果我在真實設備上啓動它,則不會更新並插入圖像。同樣在真實的設備上,我沒有例外。 我做錯了什麼?

+0

到底是什麼問題了嗎?你有例外嗎?結果不符合預期嗎?這兩種方法(更新和插入)都不起作用嗎? – 2013-04-08 12:32:28

回答

0

試試這個...

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