繁体   English   中英

如何使所有联系人与给定联系人合并

[英]How to get all contacts merged with given contact

我正在尝试显示联系人列表以及与之相关的照片,但是我看到大多数没有照片的联系人,尽管当我进入手机的默认(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);
}

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

谢谢!

(我从我们的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,然后将其放入Contact对象中,然后就可以使用

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

或者您可以使用Picasso Image Loader: Picasso

然后使用以下代码:

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

如您所见,我不使用BitMaps或解码流。 您只需要照片的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移至其所属的联系人。

如果您还有其他问题,请回来。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM