我是新来开发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欣赏什么我可能是错在这里做任何建议。另外,我尽量保持精确,但如果您有兴趣或需要更多信息,请不要犹豫,问问。
非常感谢您帮助我的努力。
此致敬礼,尼克拉斯