使用照片获取联系人信息的有效方法

Posted

技术标签:

【中文标题】使用照片获取联系人信息的有效方法【英文标题】:Effective way to get contacts info with photo 【发布时间】:2012-06-04 10:09:53 【问题描述】:

我想获取所有联系人的一些基本信息(我使用 api lvl 8)。目前我使用这个代码sn-p

private List<ContactInfo> readContacts() 

    ContentResolver cr = getContentResolver();
    Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null,
            null, null, Phone.DISPLAY_NAME + " ASC");

    for (int i = 0; i < cur.getColumnCount(); i++) 

        Log.v("COlum", cur.getColumnName(i));

    
    List<ContactInfo> temp = new ArrayList<ContactInfo>();
    if (cur.getCount() > 0) 

        while (cur.moveToNext()) 
            ContactInfo mContactInfo = new ContactInfo();
            String id = cur.getString(cur
                    .getColumnIndex(ContactsContract.Contacts._ID));
            mContactInfo.setId(Long.parseLong(id));
            String name = cur
                    .getString(cur
                            .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
            if (Integer
                    .parseInt(cur.getString(cur
                            .getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) 
                mContactInfo.setmDisplayName(name);

                // get the <span class="IL_AD" id="IL_AD7">phone
                // number</span>
                Cursor pCur = cr.query(
                        ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                        null,
                        ContactsContract.CommonDataKinds.Phone.CONTACT_ID
                                + " = ?", new String[]  id , null);
                while (pCur.moveToNext()) 
                    String phone = pCur
                            .getString(pCur
                                    .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));

                    mContactInfo.setmPhoneNumber(phone);
                
                pCur.close();

                // get email and type

                Cursor emailCur = cr.query(
                        ContactsContract.CommonDataKinds.Email.CONTENT_URI,
                        null,
                        ContactsContract.CommonDataKinds.Email.CONTACT_ID
                                + " = ?", new String[]  id , null);
                while (emailCur.moveToNext()) 
                    // This would allow you get several email <span
                    // class="IL_AD" id="IL_AD9">addresses</span>
                    // if the email addresses were stored in an array
                    String email = emailCur
                            .getString(emailCur
                                    .getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));

                    mContactInfo.setmEmail(email);
                
                emailCur.close();

                temp.add(mContactInfo);
            
        
    
    return temp;


并传递给自定义适配器(扩展 baseadapter)。我使用以下方式获取联系人的照片:

public static Bitmap loadContactPhoto(ContentResolver cr, long id) 
        Uri uri = ContentUris.withAppendedId(
                ContactsContract.Contacts.CONTENT_URI, id);
        InputStream input = openContactPhotoInputStream1(cr, uri);
        if (input == null) 
            return null;
        
        return BitmapFactory.decodeStream(input);

我在手机上测试了 2 个联系人(有照片)。我花了大约 10 秒的时间在第一次运行时获取所有联系人。我尝试在应用程序设置中强制关闭并再次运行。这次获取数据花了~2s。所以我想知道获取联系人信息的最有效方法。

我发现了一些类似的 SO 问题,但它们不需要照片。 contacts in android 我尝试使用光标和光标适配器,但我不知道同时获取 photo_uri + 联系人姓名的查询。

编辑:我删除了所有我可以在循环之外的 getColumnIndex 并仅投影我想要的列。性能更好(10s => 5s)。

我想知道的: 查询信息并设置为我的 ContactInfo 模型或同时获取姓名、电话号码、电子邮件、照片以传递给光标适配器的查询的更好方法。

提前致谢

【问题讨论】:

【参考方案1】:

我更改为CusorAdapter 并使用通讯录应用程序中的ContactsPhotoLoader 并提高了性能。

【讨论】:

您好,感谢您的链接。你能提供一些你如何解决这个问题的样本吗?提前致谢。【参考方案2】:

要获取联系信息,您必须使用 Android Contact API。此外,对于 API 4 (1.6) 以下的 android api 和 Android API 5 (2.0) 及更高版本,您必须以不同的方式处理此 Api:

我会为你提供一些对你有帮助的好链接:

    Working With Android Contacts Handling Contact Photos (All API Levels) Using the Contact Picker API 2.0 and above

    Retrieving Contact Information (Name, Number, and Profile Picture) API4 and lower

    还有一些类似于你的 SO 线程,一定对你有帮助

get contact info from android contact picker

Getting a Photo from a Contact

【讨论】:

在问这个问题之前我访问了你所有的链接:(。我想要的是如何更快地获取信息。

以上是关于使用照片获取联系人信息的有效方法的主要内容,如果未能解决你的问题,请参考以下文章

Android,如何获取 Facebook/Twitter/etc 联系人照片

如何使用 SwiftUI 在 iOS 上获取和显示联系人照片?

使用 Kotlin 从联系人列表中获取联系人信息

获取联系人照片

使用 LOOKUP_URI 在 Android (API 8) 中获取联系人照片

Android - 从电话号码获取联系人照片