使用ContentProvider从联系人中获取电话号码 - Android

5
我正在制作一个小应用程序,使用内容提供程序获取我的电话联系人,并将它们显示在一个列表视图中,如下所示。

enter image description here

我想要选择列表视图中的一行,并自动拨打该特定联系人的电话。我尝试过一些方法,但它们都不起作用。有什么想法吗?这是我的代码。
public class MainActivity extends ListActivity implements AdapterView.OnItemClickListener{
ArrayAdapter<String> adapter;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    ContentResolver cr = getContentResolver();
    Cursor c = cr.query(ContactsContract.Contacts.CONTENT_URI,
            new String[] {ContactsContract.Contacts.DISPLAY_NAME},
            null, null, null);

    List<String> contacts = new ArrayList<String>();
    if (c.moveToFirst()) {
        do {
            contacts.add(c.getString(c.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)));
        } while (c.moveToNext());
    }
    adapter = new ArrayAdapter<String>(this, R.layout.activity_main, contacts);
    setListAdapter(adapter);



}

@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

      //The answer should be inside here.

  }
}

1
不要创建一个POJO类,不要在循环中迭代Cursor,不要使用ArrayAdapter,那么要怎么办?使用SimpleCursorAdapter替代即可。这就是全部。 - pskink
@pskink 好主意。我总是忘记 CursorAdapters 的存在,不知为何从来没有多使用过。 - Mike M.
@MikeM. 至少你知道在使用基于Cursor的数据模型时,它们比使用POJO/loop/ArrayAdapter要好得多,这里有95%的人不知道,更糟糕的是他们固执地坚持使用不良的实践... - pskink
2个回答

5

首先,请确保您已将权限添加到 AndroidManifest.xml 文件中:

<uses-permission android:name="android.permission.READ_CONTACTS"/>
更新: 在Android 6及以上版本中,仅在清单中声明权限是不够的,您必须明确要求用户授予读取联系人的权限,否则将会出现异常。有关详细信息,请参见此答案
然后您可以像下面这样遍历您的手机联系人:
Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI,null, null, null, null); 
while (cursor.moveToNext()) { 
    String contactId = cursor.getString(cursor.getColumnIndex( 
    String hasPhone = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));

    if (Boolean.parseBoolean(hasPhone)) { 
        // You know it has a number so now query it like this
        Cursor phones = getContentResolver().query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = "+ contactId, null, null); 
        while (phones.moveToNext()) { 
            String phoneNumber = phones.getString(phones.getColumnIndex( ContactsContract.CommonDataKinds.Phone.NUMBER));                 
        } 
        phones.close(); 
    }

    Cursor emails = getContentResolver().query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = " + contactId, null, null); 

    while (emails.moveToNext()) { 
        // This would allow you get several email addresses 
        String emailAddress = emails.getString( 
        emails.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA)); 
    } 

    emails.close();
}

1
感谢@Theo的回应。 - Rajan Bhavsar

1
尝试使用:
private void doMagicContacts() {
    Cursor cursor = getContentResolver()
            .query(ContactsContract.Contacts.CONTENT_URI,
                    null,
                    null,
                    null,
                    null);

    if (cursor == null) {
        return;
    }

    cursor.moveToFirst();

    do {
        String name = cursor.getString(
                cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
        String id = cursor.getString(
                cursor.getColumnIndex(ContactsContract.Contacts.NAME_RAW_CONTACT_ID));

        Cursor phones = getContentResolver()
                .query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                        null,
                        ContactsContract.CommonDataKinds.Phone.RAW_CONTACT_ID+" = " + id,
                        null,
                        null);
        if (phones != null) {
            while (phones.moveToNext()) {
                String phoneNumber = phones.getString(
                        phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                Log.d(TAG, "doMagicContacts: " + name + " " + phoneNumber);
            }
            phones.close();
        }

    } while (cursor.moveToNext());

    cursor.close();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接