Как установить фото в андроид через контакты api - PullRequest
1 голос
/ 06 февраля 2012

Я новичок в разработке приложений для Android, и в настоящее время я пытаюсь сделать следующее: Поиск в заметках всех контактов для определенной строки (скажем, «E-Plus») и, если найден, размещение определенного значка (скажем, логотип E-Plus) в качестве фотографии контакта.

Я получил его, используя eclipse и следующий тест AVD: Платформа: Android 2.3.3 Уровень API: 10 CPU / ABI: ARM (armeabi)

Теперь, когда я копирую файл * .apk, сгенерированный из затмения, на свой Samsung Galaxy S2, приложение работает только частично.Я добавил строку для отображения тоста после поиска по всем контактам, который говорит мне, сколько контактов было найдено с определенной строкой.Это число верно, когда я запускаю приложение на моем реальном Galaxy S2.

Но, в отличие от среды тестирования, приложение не устанавливает фотографию впоследствии.Приложение также не падает.Тогда я подумал, что установка фотографии может быть слишком сложной в качестве первого подхода, поэтому я также попытался добавить номер телефона - тот же результат.Номер телефона добавляется правильно в тестовой среде, но не на моем реальном телефоне.

Я попытался использовать контакт Google на своем телефоне и обычный контакт для записи в телефонной книге, чтобы получить определенную заметку в своих данных.Оба приложения были правильно найдены (то есть записка прочитана, а строка найдена), но ни у одного из них не было установлен фото или номер телефона после запуска приложения.

Вот что я делаю:

Следующий код должен загрузить все контакты и сохранить их идентификатор и примечание.Обратите внимание, что ContactInfo - это простой класс с переменными для хранения contactId и т. Д. (String contactId, String note, Byte [] Photo) и соответствующих методов get и set.

public ArrayList<ContactInfo> loadAllContacts(ContentResolver cr) {
    ArrayList<ContactInfo> contactList = new ArrayList<ContactInfo>();

        Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI,null, null, null, null);
        if (cur.getCount() > 0) {
            while (cur.moveToNext()) {
                String contactId = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
                ContactInfo contactInfo = new ContactInfo(contactId);

                // Get Note
                    String where = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?"; 
                    String[] whereParams = new String[]{contactId,ContactsContract.CommonDataKinds.Note.CONTENT_ITEM_TYPE}; 
                            Cursor noteCur = cr.query(ContactsContract.Data.CONTENT_URI, null, where, whereParams, null); 
                    if (noteCur.moveToFirst()) { 
                        String note = noteCur.getString(noteCur.getColumnIndex(ContactsContract.CommonDataKinds.Note.NOTE));
                        contactInfo.setNote(note);
                    } 
                    noteCur.close();                        

                contactList.add(contactInfo);                   
            }
        }

    return contactList;
}

Следующий код должен обновить всеконтакты с настройкой фото (и для дальнейшего тестирования, номер телефона).Метод setPhoto я получил из следующего блога: Обработка фотографий контактов , и поскольку он отлично работал при тестировании AVD, я подумал, что в нем, вероятно, нет ошибок.

public void updateAllContacts(ContentResolver cr, ArrayList<ContactInfo> contactList) {
    while (!contactList.isEmpty()) {
        ContactInfo contact = contactList.remove(0);
        String contactId = contact.getContactId();

        setPhoto(cr,contact.getPhoto(),contactId);
        setPhoneNumber(cr,contact.getPhoneNumber(),contactId);
    }

}

public void setPhoneNumber(ContentResolver cr, String phoneNumber, String contactId) {
    ContentValues values = new ContentValues();

    values.put(ContactsContract.Data.RAW_CONTACT_ID, contactId);
    values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE);
    values.put(ContactsContract.CommonDataKinds.Phone.NUMBER,phoneNumber);
    values.put(ContactsContract.CommonDataKinds.Phone.TYPE, Phone.TYPE_CUSTOM);

    cr.insert(ContactsContract.Data.CONTENT_URI, values);
}

public void setPhoto(ContentResolver cr, byte[] bytes, String contactId) {      
    ContentValues values = new ContentValues();
    int photoRow = -1;
    String where = ContactsContract.Data.RAW_CONTACT_ID + " = " + contactId + " AND " + ContactsContract.Data.MIMETYPE + "=='" + ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE + "'";
    Cursor cursor = cr.query(ContactsContract.Data.CONTENT_URI, null, where, 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, contactId);
    values.put(ContactsContract.Data.IS_SUPER_PRIMARY, 1);
    values.put(ContactsContract.CommonDataKinds.Photo.PHOTO, bytes);
    values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE);

    if (photoRow >= 0) {
        cr.update(ContactsContract.Data.CONTENT_URI, values, ContactsContract.Data._ID + " = " + photoRow, null);
    } else {
        cr.insert(ContactsContract.Data.CONTENT_URI, values);
    }
}

Следующая процедураЯ использую, чтобы получить байтовый массив из * .png в папке res моего приложения.

public static byte[] getByteArrayFromResource(Resources rsrc,int id) {
    Bitmap bmp = BitmapFactory.decodeResource(rsrc,id);
    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
    byte[] bytes = stream.toByteArray();

    return bytes;
}

Наконец, то, что я выполняю в своей основной подпрограмме, это:

ArrayList<ContactInfo> contactList = new ArrayList<ContactInfo>();
ContactsAccessor contactsAccessor = new ContactsAccessor();
contactList = contactsAccessor.loadAllContacts(getContentResolver());

int test = 0;
for (int i=0; i<contactList.size(); i++) {
     ContactInfo contact = contactList.get(i);
     String note = contact.getNote();

     if (note.contains("TESTSHRAZAAM")) {                       
        contact.setPhoneNumber("12345");
        contact.setPhoto(ImageHandler.getByteArrayFromResource(getResources(),R.drawable.ic_eplus));
        test = test+1;
     }
 }

 contactsAccessor.updateAllContacts(getContentResolver(), contactList);

 if (test>0) Toast.makeText(WelchesNetzIcons.this,"Es wurden "+test+" Icons gesetzt.", Toast.LENGTH_SHORT).show();
 else Toast.makeText(WelchesNetzIcons.this, "Es wurden keine Icons gesetzt.", Toast.LENGTH_SHORT).show();

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

Большое спасибо за ваши усилия, оказанные мне.

С уважением, Никлас

1 Ответ

1 голос
/ 11 апреля 2013

Попробуйте использовать этот код.Это работает для меня.

Ваша проблема может быть в неправильном идентификаторе контакта или неверном mimetype

// ищет контакт

String select = String.format("%s=? AND %s='%s'", Phone.NUMBER, Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
String[] project = new String[] { Data.RAW_CONTACT_ID };
Cursor c = context.getContentResolver().query(Data.CONTENT_URI, project, select, new String[] { contact.getPhone() }, null);

if(c.moveToFirst()){
  rawContactId = c.getLong(c.getColumnIndex(Data.RAW_CONTACT_ID));
}

//set photo
Bitmap bit = //your photo
ByteArrayOutputStream streamy = new ByteArrayOutputStream(); 
bit.compress(CompressFormat.PNG, 0, streamy); 
byte[] photo = streamy.toByteArray();

ContentValues values = new ContentValues(); 

values.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId); 
values.put(ContactsContract.Data.IS_SUPER_PRIMARY, 1); 
values.put(ContactsContract.CommonDataKinds.Photo.PHOTO, photo); 
values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE); 

ContactHelper.context.getContentResolver().insert(ContactsContract.Data.CONTENT_URI, values);
...