Android 3.0 - 如何通过 ContactsContract 检索所有联系人

Posted

技术标签:

【中文标题】Android 3.0 - 如何通过 ContactsContract 检索所有联系人【英文标题】:Android 3.0 - How to retrieve ALL contacts via ContactsContract 【发布时间】:2012-02-17 23:44:47 【问题描述】:

我正在开发一个 android Honeycomb (v3.0) 应用程序,该应用程序需要显示存储在设备上注册的 Google 帐户中的所有联系人。我遇到的问题之一是我只能检索“我的联系人”、“Android 中已加星标”和“其他联系人”中可用的联系人。我还希望能够从“目录”中检索联系人。我相信“目录”部分是 Google 为希望向其他人提供其域内所有成员/员工目录的组织和公司提供的一项功能。请看下面的截图:

到目前为止,我的清单文件中有以下行:

<uses-permission android:name="android.permission.READ_CONTACTS" />

我已尝试使用此代码:

Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); 
while (cursor.moveToNext())  
    String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
 
cursor.close();

就我而言,“我的联系人”和“在 Android 中已加星标”是空的。但是,获得了“其他联系人”中的(1)联系人。不过,“目录”包含数百个未检索到的联系人。

我的问题:有什么方法可以确保“目录”中的联系人也被检索到?我知道我可以简单地使用网络浏览器复制联系人然后同步将它们添加到设备中,但是如果将新联系人添加到“目录”中,我每次都必须手动执行此操作,因此这对我来说不是一个好选择。请指教。

【问题讨论】:

developer.android.com/resources/samples/ContactManager/… 我刚刚尝试了 getContacts() 函数(ContactManager.java 文件)中的代码,但无论我将 mShowInvisible 设置为什么,最终都没有条目。 设置 String selection = null; 返回的结果与我最初使用我提到的代码时的结果相同。 在搜索答案但找不到答案后,我最终将目录中的联系人复制到“我的联系人”中。很遗憾,这必须手动完成。 【参考方案1】:

看下面的代码

import android.app.Activity;
import android.content.ContentResolver;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.ContactsContract;
          public class TestContacts extends Activity 
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    ContentResolver cr = getContentResolver();
    Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null,
            null, null, null);
    if (cur.getCount() > 0) 
        while (cur.moveToNext()) 
            String id = cur.getString(cur
                    .getColumnIndex(ContactsContract.Contacts._ID));
            String name = cur
                    .getString(cur
                            .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
      if (("1")
                    .equals(cur
                            .getString(cur
                                    .getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER)))) 
                Cursor pCur = cr.query(
                        ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                        null,
                        ContactsContract.CommonDataKinds.Phone.CONTACT_ID
                                + " = ?", new String[]  id , null);
                int i = 0;
                int pCount = pCur.getCount();
                String[] phoneNum = new String[pCount];
                String[] phoneType = new String[pCount];
                while (pCur.moveToNext()) 
                    phoneNum[i] = pCur
                            .getString(pCur
                                    .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                    phoneType[i] = pCur
                            .getString(pCur
                                    .getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE));

                    i++;
                
            

【讨论】:

我认为Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); 将无法查询“目录”。我相信我以前曾尝试过。 我无法为这个问题找到友好的解决方案。我使用的一种解决方法是手动将联系人从“目录”添加到“我的联系人”。这将使您发布的代码工作得很好(我的最终有点不同,但想法是一样的)。当然,如果“目录”中有新条目,则必须手动移动。如果我找到更好的方法,我会报告。 @BVB 您在此期间找到更好的解决方案了吗? 我从几年前就没有接触过这个问题,不幸的是,当时还没有找到更好的解决方案。

以上是关于Android 3.0 - 如何通过 ContactsContract 检索所有联系人的主要内容,如果未能解决你的问题,请参考以下文章

cocos2d-x 3.0 Android环境搭建(亲測通过)

如何删除 android 2.2 上的联系人?

如何从 android 手机中获取已删除的联系人以及如何恢复它

如何获得低于 3.0 版本的 Android 设备的实时流媒体音频?

android开发 百度地图3.0以上版本,如何显示自定义标记图标?

如何从 Android 中的联系人中获取 ContactNumbers 数组的联系人姓名?