2013-07-22 2 views
4

У меня есть изображение, которое хранится в телефоне android. Я хочу иметь возможность изменить изображение контакта.Смена контактного изображения программно

Что я сделал до сих пор, это запуск выбора контактов, выбор пользователя для контакта, а затем я получаю URI выбранного контакта. Из этого контакта я могу получить связанный с ним rawContact, и я использую this code.

Uri rawContactPhotoUri = Uri.withAppendedPath(
      ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), 
      RawContacts.DisplayPhoto.CONTENT_DIRECTORY); 
    try { 
     AssetFileDescriptor fd = 
      getContentResolver().openAssetFileDescriptor(rawContactPhotoUri, "rw"); 
     OutputStream os = fd.createOutputStream(); 
     os.write(photo); 
     os.close(); 
     fd.close(); 
    } catch (IOException e) { 
     // Handle error cases. 
    } 

Проблема заключается в том, то AssetFIleDescriptor всегда пусто (когда я звоню длину на это, мы всегда получаем -1).

Я не прошу решения в целом, просто некоторые из них приводят к следующему, что может помочь мне получить эту работу. Я не могу найти эту проблему уже на StackOverflow, поэтому любая помощь будет оценена.

EDIT

Это всегда, когда мы задаем на вопрос, что мы найдем решение. я хочу поделиться им для других

Так что я отказался от андроида связи и найти еще один: http://wptrafficanalyzer.in/blog/programatically-adding-contacts-with-photo-using-contacts-provider-in-android-example/

Початкоотделителя картины вернуть Uri выбранного контакта, так что с этим вы можете получить контакт. _ID его:

// This is onActivityResult 
final Uri uri = data.getData(); 
final Cursor cursor1 = getContentResolver().query(uri, null, null, null, null); 
cursor.moveToFirst(); 
final long contactId = cursor1.getLong(cursor1.getColumnIndex(Contacts._ID); 
cursor1.close(); 

Тогда я должен был получить RawContactId:

final Cursor cursor2 = getContentResolver().query(RawContacts.CONTENT_URI, null,  RawContacts.Contact_ID + "=?", new String[] {String.valueOf(contactId)}, null); 
cursor2.moveToFirst(); 
final long rawContactId = cursor2.getLong(cursor2.getColumnIndex(RawContacts._ID)); 
cursor2.close(); 

Тогда я должен был получить Data._ID RawContacts (так же, как указано выше).

Тогда я использовал ContentProviderOperations:

final ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>(); 
ops.add(ContentProviderOperation.newUpdate(Data.CONTENT_URI) 
    .withSelection(Data._ID, dataId), 
    .withValue(Data.MIMETYPE, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE) 
    .withValue(ContactsContract.CommonDataKinds.Photo.PHOTO, byteArrayOfThePicture); 

getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops); 

И это работает как шарм. Надеюсь, это поможет

+0

Какие разрешения у вас есть в вашем AndroidManifest.xml? Узел выбора контактов предоставляет временное разрешение READ для полученного URI, но вам необходимо установить разрешение WRITE_CONTACTS для фактического обновления контакта. – Josiah

+0

У меня есть разрешение READ и WRITE_CONTACT. – Tristan

ответ

1
String contactId ="10001"; // change it as your IDs 
    if (mBitmap != null) { 
       // Picture 
       try { 
        ByteArrayOutputStream image = new ByteArrayOutputStream(); 
        mBitmap.compress(Bitmap.CompressFormat.JPEG, 100, image); 

        Uri rawContactUri = null; 
        Cursor rawContactCursor = managedQuery(
          ContactsContract.RawContacts.CONTENT_URI, 
          new String[]{ContactsContract.RawContacts._ID}, 
          ContactsContract.RawContacts.CONTACT_ID + " = " + contactId, 
          null, 
          null); 
        if (!rawContactCursor.isAfterLast()) { 
         rawContactCursor.moveToFirst(); 
         rawContactUri = ContactsContract.RawContacts.CONTENT_URI.buildUpon().appendPath("" + rawContactCursor.getLong(0)).build(); 
        } 
        rawContactCursor.close(); 

        ContentValues values = new ContentValues(); 
        int photoRow = -1; 
        String where111 = ContactsContract.Data.RAW_CONTACT_ID + " == " + 
          ContentUris.parseId(rawContactUri) + " AND " + ContactsContract.Data.MIMETYPE + "=='" + 
          ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE + "'"; 
        Cursor cursor = managedQuery(
          ContactsContract.Data.CONTENT_URI, 
          null, 
          where111, 
          null, 
          null); 
        int idIdx = cursor.getColumnIndexOrThrow(ContactsContract.Data._ID); 
        if (cursor.moveToFirst()) { 
         photoRow = cursor.getInt(idIdx); 
        } 

        cursor.close(); 


        values.put(ContactsContract.Data.RAW_CONTACT_ID, 
          ContentUris.parseId(rawContactUri)); 
        values.put(ContactsContract.Data.IS_SUPER_PRIMARY, 1); 
        values.put(ContactsContract.CommonDataKinds.Photo.PHOTO, image.toByteArray()); 
        values.put(ContactsContract.Data.MIMETYPE, 
          ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE); 
        if (photoRow >= 0) { 
         getContentResolver().update(
           ContactsContract.Data.CONTENT_URI, 
           values, 
           ContactsContract.Data._ID + " = " + photoRow, null); 
        } else { 
         getContentResolver().insert(
           ContactsContract.Data.CONTENT_URI, 
           values); 
        } 
       } catch (Exception e) { 
        Log.e("[email protected]@Image_Exception", e + ""); 
       } 
      } 
try { 
      getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops); 
     } catch (Exception e) { 
      Log.e("@@@@@UPLOADERR", e + ""); 
     } 
Смежные вопросы