【问题标题】:How to get all contacts merged with given contact如何让所有联系人与给定联系人合并
【发布时间】:2023-03-14 16:48:01
【问题描述】:

我正在尝试显示联系人列表以及与他们关联的照片,但是当我转到手机 (SG2) 的默认联系人列表时,我看到大多数联系人没有照片,尽管他们确实有照片。我认为这是因为其中一些联系人实际上是合并的,而图片来自列表中未显示的(原始?)联系人,所以问题是 - 如何将所有联系人与给定联系人合并?我尝试使用 SQLite,但找不到任何可以唯一标识合并联系人的列。

从代码的角度来看,我是从这个方法开始的: protected Bitmap getImageByContactId(final Context appContext, final String strContactId) { 位图 bmContactImage = null;

    Uri contactUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, Long.parseLong(strContactId));
    Uri photoUri = Uri.withAppendedPath(contactUri, ContactsContract.Contacts.Photo.CONTENT_DIRECTORY);

    InputStream image = null;
    try {
        image = appContext.getContentResolver().openInputStream(photoUri);
        bmContactImage = BitmapFactory.decodeStream(image);

        try {
            image.close();
        } catch (IOException e ) {
            e.printStackTrace();
        }

    } catch (FileNotFoundException e1) {
        // This can be ignored because the Uri is generic and photo may not really exist
    }

    return bmContactImage;
}

但这仅返回与匹配原始搜索条件的“原始”联系人关联的照片(在我的情况下 - 联系人 ID) - 如果图片与链接到原始联系人的联系人相关联,则不会。

如果我只能获得与原始联系人链接/关联/合并的联系人的(原始?)ID,我希望能够进行以下工作,但我似乎无法找到找到的方法那些“其他”联系人...

public static Bitmap loadContactPhoto(ContentResolver cr, long id) {
    Uri uri = Uri.parse(String.format("content://com.android.contacts/contacts/%s", id));
    InputStream input = ContactsContract.Contacts.openContactPhotoInputStream(cr, uri);
    if (input == null) {
        return null;
    }
    return BitmapFactory.decodeStream(input);
}

底线 - 我要做的是显示联系人的照片,无论它是来自与搜索条件匹配的联系人 - 还是与该联系人合并的任何联系人 - 任何解决方案都将不胜感激!

谢谢!

【问题讨论】:

  • 如果您发布代码,尝试帮助您会更容易...

标签: android android-sqlite contacts photo


【解决方案1】:

(我是从我们的 facebook 页面来到这里的..)

这是我从内容解析器获取所有联系人的方式:

public void addContactsMultiple()
{
    Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI,
            null, null, null, null);
     if (cur.getCount() > 0) {          
           String id="";//Contact ID
           String name="";//Contact Name
           id = "";
           id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
           name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
           if(Integer.parseInt
           (cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {
               //Getting the Contact Image
               if(cur.getString(cur
                        .getColumnIndex(ContactsContract.CommonDataKinds.Phone.PHOTO_URI)) !=  null)
               {
                   imagePath = cur
                      .getString(cur
                        .getColumnIndex(ContactsContract.CommonDataKinds.Phone.PHOTO_URI));
               }
               else {imagePath="none";}//If there is no contact image
          }

       }
       cur.close();
       }

在我的代码中,您可以获取图像 URI,然后将其放入您的联系人对象中,然后就可以使用了

      ImageView image = (ImageView)findViewById(R.id.image)
      image.setImageURI(Uri.parse(imagePath));

或者您可以使用毕加索图像加载器: Picasso

然后使用此代码:

           Picasso.with(context)
           .load(imagePath)
           .skipMemoryCache()
           .into(image );

如您所见,我不使用 BitMaps 或 decodeStream。 您只需要照片的 uri(将您的图片定向到 Android 库)

如果您有多个同名联系人,您可以使用此代码来标记他们:

//(mContactList) is the ArrayList of contacts object I have created)
 HashSet<Contact> hs = new HashSet<Contact>();
        hs.addAll(mContactList);
        mContactList.clear();
        mContactList.addAll(hs);

此代码将删除重复项

稍作调整,您就可以将图像 uri 获取到它所属的联系人。

如果您有更多问题,请回来。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-28
    • 2011-07-13
    • 2012-09-02
    • 2011-10-09
    • 1970-01-01
    相关资源
    最近更新 更多