📜  如何使用游标在Android应用程序中获取已保存的联系人?(1)

📅  最后修改于: 2023-12-03 14:52:05.846000             🧑  作者: Mango

如何使用游标在Android应用程序中获取已保存的联系人?

在Android中,我们通常需要获取用户已保存的联系人信息。使用游标可以很方便地获取数据并进行处理。在本文中,我们将介绍如何使用游标在Android应用程序中获取已保存的联系人信息。

获取联系人信息

首先,我们需要获取联系人的基本信息,包括姓名和电话号码。我们可以使用ContentResolver类和ContactsContract构建查询,然后使用游标来获取数据。

Uri uri = ContactsContract.Contacts.CONTENT_URI;
String[] projection = {
    ContactsContract.Contacts._ID,
    ContactsContract.Contacts.DISPLAY_NAME
};
String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " ASC";
Cursor cursor = getContentResolver().query(uri, projection, null, null, sortOrder);

此处,我们使用了ContactsContract.Contacts.CONTENT_URI获取联系人信息的URL。projection数组包含我们需要返回的数据列。我们排序的方式是按照联系人姓名的字母顺序来进行排序。最后,我们使用getContentResolver().query()方法执行查询,并将结果保存在cursor游标对象中。

处理联系人信息

接下来,我们需要从游标中提取数据,包括联系人姓名和电话号码。我们可以使用ContactsContract.CommonDataKinds.PhoneContactsContract.Data表来获取电话号码。

while (cursor.moveToNext()) {
    long id = cursor.getLong(cursor.getColumnIndex(ContactsContract.Contacts._ID));
    String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
    Cursor phoneCursor = getContentResolver().query(
        ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
        null,
        ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?",
        new String[]{String.valueOf(id)},
        null);
    String phone = "";
    if (phoneCursor.moveToNext()) {
        phone = phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
    }
    phoneCursor.close();
    
    // 处理联系人信息
    Log.d(TAG, "Contact: " + name + " " + phone);
}

在上面的代码中,我们使用cursor.getLong()cursor.getString()方法从游标中提取联系人的ID和姓名。接下来,我们使用另一个游标phoneCursor查询每个联系人的电话号码。查询条件为ContactsContract.CommonDataKinds.Phone.CONTACT_ID等于当前联系人的ID。如果有电话号码,则使用phoneCursor.getString()方法提取电话号码,否则为""

最后,我们在循环中对每个联系人信息进行处理,这里打印联系人姓名和电话号码。我们可以根据需要将信息存储到变量或集合中。

完整代码
Uri uri = ContactsContract.Contacts.CONTENT_URI;
String[] projection = {
    ContactsContract.Contacts._ID,
    ContactsContract.Contacts.DISPLAY_NAME
};
String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " ASC";
Cursor cursor = getContentResolver().query(uri, projection, null, null, sortOrder);

while (cursor.moveToNext()) {
    long id = cursor.getLong(cursor.getColumnIndex(ContactsContract.Contacts._ID));
    String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
    Cursor phoneCursor = getContentResolver().query(
        ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
        null,
        ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?",
        new String[]{String.valueOf(id)},
        null);
    String phone = "";
    if (phoneCursor.moveToNext()) {
        phone = phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
    }
    phoneCursor.close();
    
    // 处理联系人信息
    Log.d(TAG, "Contact: " + name + " " + phone);
}

cursor.close();

以上是使用游标在Android应用程序中获取已保存的联系人信息的示例代码。

参考链接