我是新來開發android應用程序,我目前正在嘗試執行以下操作: 搜索某個字符串的所有聯繫人的註釋(例如:「E-Plus 「),如果找到,請將某個圖標(如E-Plus徽標)作爲他們的聯繫照片。如何在android中通過聯繫人api設置照片
我得到它的工作使用Eclipse和下面的測試AVD: 平臺:安卓2.3.3 API等級:10 CPU/ABI:ARM(armeabi)
現在,當我複製* .apk文件從eclipse生成的文件到我的三星Galaxy S2,該應用程序只能部分工作。 我在搜索所有聯繫人後添加了一行以顯示敬酒,這告訴我用特定字符串找到了多少聯繫人。這個數字是正確的,當我在我的實際Galaxy S2上執行應用程序。
但是與測試環境相反,應用程序並沒有在之後設置照片。該應用程序也不會崩潰。 然後,我想,設置一張照片可能太難作爲第一種方法,所以我也嘗試添加一個電話號碼 - 相同的結果。 電話號碼在測試環境中正確添加,但不在我的實際電話上。
我試了我的手機上的谷歌聯繫人和正常的電話簿輸入聯繫人,以在其細節中具有特定的筆記。 這兩個找到正確的應用程序(這是筆記被讀取和字符串被發現),但他們都沒有運行應用程序後設置的照片或電話號碼。
這裏是我做的:
下面的代碼應該加載所有的聯繫人,並保存它們的ID和註釋。請注意,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方法:Handling Contact Photos,因爲它在測試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);
}
}
下面的例程我用來從我的應用程序的res文件夾中的* .png獲取字節數組。
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();
我geatly欣賞什麼我可能是錯在這裏做任何建議。另外,我儘量保持精確,但如果您有興趣或需要更多信息,請不要猶豫,問問。
非常感謝您幫助我的努力。
此致敬禮,尼克拉斯