在Android中从URI检索联系人电话号码

在Android中从URI检索联系人电话号码,android,contactscontract,Android,Contactscontract,在我从内置活动中检索到联系人的ID号后,我正在尝试获取联系人的电话号码。然而,每当我在下面的代码中使用光标查询数据库时,我都会返回零行,即使我选择的联系人有一个手机号码 有谁能给我指出一个更好的方向,或者举一个例子,说明在获得用户ID后如何获取联系人的电话号码 我的代码: private Runnable getSMSRunnable() { return new Runnable() { public void run() { Intent i = new In

在我从内置活动中检索到联系人的ID号后,我正在尝试获取联系人的电话号码。然而,每当我在下面的代码中使用光标查询数据库时,我都会返回零行,即使我选择的联系人有一个手机号码

有谁能给我指出一个更好的方向,或者举一个例子,说明在获得用户ID后如何获取联系人的电话号码

我的代码:

    private Runnable getSMSRunnable() {
    return new Runnable() {
    public void run() {
    Intent i = new Intent(Intent.ACTION_PICK,
      ContactsContract.CommonDataKinds.Phone.CONTENT_URI);
    startActivityForResult(i, CONTACTS_REQUEST_CODE);
   }
  };
 }
返回日志输出

content://com.android.contacts/data/6802
从中,我将ID6802传递到一个方法中,该方法设计用于从给定类型的ID返回电话号码,在本例中为ContactsContract.CommonDataTypes.phone.type\u MOBILE

public static String getContactPhoneNumberByPhoneType(Context context, long contactId, int type) {
    String phoneNumber = null;

    String[] whereArgs = new String[] { String.valueOf(contactId), String.valueOf(type) };

    Log.d(TAG, String.valueOf(contactId));

    Cursor cursor = context.getContentResolver().query(
            ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
            null,
            ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ? and "
                    + ContactsContract.CommonDataKinds.Phone.TYPE + " = ?", whereArgs, null);

    int phoneNumberIndex = cursor
            .getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.NUMBER);

    Log.d(TAG, String.valueOf(cursor.getCount()));

    if (cursor != null) {
        Log.v(TAG, "Cursor Not null");
        try {
            if (cursor.moveToNext()) {
                Log.v(TAG, "Moved to first");
                Log.v(TAG, "Cursor Moved to first and checking");
                phoneNumber = cursor.getString(phoneNumberIndex);
            }
        } finally {
            Log.v(TAG, "In finally");
            cursor.close();
        }
    }

    Log.v(TAG, "Returning phone number");
    return phoneNumber;
}
对于电话号码,它返回null-这意味着它找不到我试图访问的行-这意味着我的查询有问题-但是如果我检查一个有移动电话号码的联系人-我如何获得0行查询


任何帮助都将不胜感激。非常感谢你

这应该行得通,也许可以尝试丢失类型

电话号码存储在各自的表中,需要单独查询。要查询电话号码表,请使用SDK变量ContactsContract.CommonDataTypes.phone.CONTENT\u URI中存储的URI。使用WHERE条件获取指定联系人的电话号码

        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()) {
        // Do something with phones
        } 
        pCur.close();
    }
对Android contacts SQLite数据库执行第二次查询。根据ContactsContract.CommonDataTypes.phone.CONTENT\u URI中存储的URI查询电话号码。联系人ID作为ContactsContact.CommonDataTypes.phone.contact\u ID存储在电话表中,WHERE子句用于限制返回的数据。

我找到了答案

我没有从游标中获取任何行的原因是因为我正在使用该行

ContactsContract.CommonDataKinds.Phone.CONTACT_ID
联系人表中此数据所属行的id

因为无论如何我都是从contacts表中获取URI的——这是不需要的,下面的内容应该被替换掉。ID是与电话表中联系人对应的ID,而不是原始联系人

ContactsContract.CommonDataKinds.Phone._ID

交换行在查询中返回正确的结果。目前一切似乎都运转良好

你抄袭了你在同一类型的另一个问题上的答案。我看了那个问题,但我不应该这样做,因为我的初衷。这是有效的,即使你的解释不清楚。为什么Phone.CONTACT\u ID CONTACT\u ID与CONTACTS不匹配。\u ID\u ID如果我这样解释可能会更容易:ID是数据库的,CONTACT\u ID是在不查询特定表时的联系人ID。这有帮助吗?底线是:电话。_ID==联系人。_ID