Как установить изображение по умолчанию для контакта телефона Android, у которого нет предыдущего изображения

У меня есть фрагмент кода, который обновляет изображение контакта Android, проблема в том, что он не работает, когда у контакта нет предыдущего изображения. Я также проверил, что контакт был из учетной записи «Телефон» или учетной записи «*@gmail.com». Когда у него уже есть изображение с этими учетными записями, у меня нет проблем с обновлением изображения, проблема заключается только в том, что контакту не назначено предыдущее изображение.

Вот метод, отвечающий за обновление изображения.

public void update(long id, Bitmap bitmap) {       

    ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();

    // Picture
    try
    {
        ByteArrayOutputStream image = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.JPEG , 100, image);

        Builder builder = ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI);
        builder = ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI);
        builder.withSelection(ContactsContract.Data.CONTACT_ID + "=?" + " AND " + ContactsContract.Data.MIMETYPE + "=?", 
                new String[]{String.valueOf(id), ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE});
        builder.withValue(ContactsContract.CommonDataKinds.Photo.PHOTO, image.toByteArray());
        ops.add(builder.build());
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }

    try
    {
        this.context.getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
}

И вот как я узнаю, принадлежит ли контакт одной из двух учетных записей, о которых я упоминал выше:

// Getting the raw contact id
public static int getRawContactId(Context context, long id) {

    String[] projection = new String[] { ContactsContract.RawContacts._ID };
    String selection = ContactsContract.RawContacts.CONTACT_ID + "=?";
    String[] selectionArgs = new String[] { String.valueOf(id) };
    Cursor c = context.getContentResolver().query(
            ContactsContract.RawContacts.CONTENT_URI, projection,
            selection, selectionArgs, null);
    int rawContactId = -1;
    if (c.moveToFirst()) {
        rawContactId = c.getInt(c
                .getColumnIndex(ContactsContract.RawContacts._ID));
    }

    return rawContactId;
}

Здесь я получаю имя учетной записи для дальнейшего анализа

//...
Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId);
String[] rawProjection = { RawContacts._ID, RawContacts.ACCOUNT_NAME };
Cursor raw = context.getContentResolver().query(rawContactUri, rawProjection, null, null, null);
if (raw.moveToFirst()) {
    account = raw.getString(1);
}

Заранее спасибо.


person Alejandro Casanova    schedule 17.06.2015    source источник


Ответы (2)


Проблема заключается в том, что, как вы описываете, вы обновляете изображение http://developer.android.com/reference/android/content/ContentProviderOperation.html#newUpdate(android.net.Uri)

вместо вставки нового http://developer.android.com/reference/android/content/ContentProviderOperation.html#newInsert(android.net.Uri)

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

Можно спорить о том, что метод API должен серьезно отказывать, вызывая исключение во время выполнения.

Надеюсь, поможет.

person Junior Buckeridge    schedule 17.06.2015

После некоторых исследований, как было предложено, я нашел подход, который отлично работает.

https://stackoverflow.com/a/15145256/2423274

Вот соответствующая часть:

// 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 (Exception e) {
    e.printStackTrace();
}
person Alejandro Casanova    schedule 22.06.2015