2012-02-06 182 views
1

我是新来开发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欣赏什么我可能是错在这里做任何建议。另外,我尽量保持精确,但如果您有兴趣或需要更多信息,请不要犹豫,问问。

非常感谢您帮助我的努力。

此致敬礼,尼克拉斯

回答

1

请尝试使用此代码。这个对我有用。

你的问题可能有误接触ID或在错误的MIME类型

//寻找接触

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);