2012-02-06 78 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); 
相關問題