Я новичок в разработке приложений для 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();
Я очень ценю любые предложения о том, что я могу делать здесь не так.Кроме того, я старался быть максимально точным, но если вы заинтересованы или нуждаетесь в дополнительной информации, пожалуйста, не стесняйтесь спрашивать.
Большое спасибо за ваши усилия, оказанные мне.
С уважением, Никлас