阅读android中所有联系人的电话号码

shu*_*uwo 68 android contacts phone-number android-contacts

我正在使用此代码检索所有联系人姓名和电话号码:

String[] projection = new String[]
{
    People.NAME,
    People.NUMBER
};

Cursor c = ctx.getContentResolver().query(People.CONTENT_URI, projection, null, null, People.NAME + " ASC");
c.moveToFirst();

int nameCol = c.getColumnIndex(People.NAME);
int numCol = c.getColumnIndex(People.NUMBER);

int nContacts = c.getCount();

do
{
  // Do something
} while(c.moveToNext());
Run Code Online (Sandbox Code Playgroud)

但是,这只会返回每个联系人的主号码,但我也想获得次要号码.我怎样才能做到这一点?

小智 149

以下代码显示了一种简单的方法来读取所有电话号码和姓名:

Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,null,null, null);
while (phones.moveToNext())
{
  String name=phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
  String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));

}
phones.close();
Run Code Online (Sandbox Code Playgroud)

注意: getContentResolver是来自Activity上下文的方法.

  • 如果联系人的号码超过1,则联系人姓名可能会更快,但联系人名称可能会重复. (15认同)
  • 它只会得到一些小联系!在我的情况下,`ContactsContract.CommonDataKinds.Phone.CONTENT_URI`让我联系361但是`ContactsContract.Contacts.CONTENT_URI`让我联系了5115!有什么区别?! (2认同)

Gra*_*can 30

您可以通过以下方式阅读与联系人关联的所有电话号码:

Uri personUri = ContentUris.withAppendedId(People.CONTENT_URI, personId);
Uri phonesUri = Uri.withAppendedPath(personUri, People.Phones.CONTENT_DIRECTORY);
String[] proj = new String[] {Phones._ID, Phones.TYPE, Phones.NUMBER, Phones.LABEL}
Cursor cursor = contentResolver.query(phonesUri, proj, null, null, null);
Run Code Online (Sandbox Code Playgroud)

请注意,此示例(与您的一样)使用已弃用的联系人API.从eclair开始,这已被ContactsContract API 取代.


val*_*dak 24

此代码显示如何获取每个联系人的所有电话号码.

ContentResolver cr = getActivity().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 (Integer.parseInt(cur.getString(cur.getColumnIndex(
                   ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {
             Cursor pCur = cr.query(
                      ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
                      null, 
                      ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?", 
                      new String[]{id}, null);
             while (pCur.moveToNext()) {
                  int phoneType = pCur.getInt(pCur.getColumnIndex(
                      ContactsContract.CommonDataKinds.Phone.TYPE));
                  String phoneNumber = pCur.getString(pCur.getColumnIndex(
                      ContactsContract.CommonDataKinds.Phone.NUMBER));
                  switch (phoneType) {
                        case Phone.TYPE_MOBILE:
                            Log.e(name + "(mobile number)", phoneNumber);
                            break;
                        case Phone.TYPE_HOME:
                            Log.e(name + "(home number)", phoneNumber);
                            break;
                        case Phone.TYPE_WORK:
                            Log.e(name + "(work number)", phoneNumber);
                            break;
                        case Phone.TYPE_OTHER:
                            Log.e(name + "(other number)", phoneNumber);
                            break;                                  
                        default:
                            break;
                  }
              } 
              pCur.close();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 14

如果它有帮助,我有一个使用ContactsContract API首先按名称查找联系人的示例,然后迭代查找特定数字类型的详细信息:

如何使用ContactsContract检索电话号码和电子邮件地址


小智 10

String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
String name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));

if (Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) 
{
    System.out.println("name : " + name + ", ID : " + id);

    // get the <span id="IL_AD4" class="IL_AD">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));
        System.out.println("phone" + phone);
    }

pCur.close();
Run Code Online (Sandbox Code Playgroud)


Gag*_*eep 9

您可以使用此方式获取所有电话联系人:

    Cursor c = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
            new String[] { ContactsContract.Contacts._ID,
                    ContactsContract.Contacts.DISPLAY_NAME,
                    ContactsContract.CommonDataKinds.Phone.NUMBER,
                    ContactsContract.RawContacts.ACCOUNT_TYPE },
            ContactsContract.RawContacts.ACCOUNT_TYPE + " <> 'google' ",
            null, null);
Run Code Online (Sandbox Code Playgroud)

检查完整示例HERE ...........

  • 对于我的~800个联系人,此答案中的代码运行89毫秒,但另一种方式(查询联系人ID,然后每个ID的电话号码)使用23 000毫秒! (2认同)