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

hwr*_*kns 9 android contactscontract

在我从内置活动中检索到他们的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);
   }
  };
 }
Run Code Online (Sandbox Code Playgroud)

返回Log输出

content://com.android.contacts/data/6802
Run Code Online (Sandbox Code Playgroud)

从中我将ID(6802)传递给一个方法,该方法旨在从具有给定类型的ID返回电话号码(在本例中为ContactsContract.CommonDataKinds.Phone.TYPE_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;
}
Run Code Online (Sandbox Code Playgroud)

对于电话号码返回null - 这意味着它无法找到我尝试访问的行 - 这意味着我的查询出现了问题 - 但是如果我检查了具有移动电话号码的联系人 - 如何我可以获得0行查询吗?

任何帮助将不胜感激.非常感谢!

hwr*_*kns 12

我找到了答案.

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

ContactsContract.CommonDataKinds.Phone.CONTACT_ID
Run Code Online (Sandbox Code Playgroud)

"此数据所属的Contacts表中行的ID."

因为我从联系人表中获取了URI - 这不是必需的,并且应该替换以下内容.ID是与电话表中的联系人相对应的ID,而不是原始联系人.

ContactsContract.CommonDataKinds.Phone._ID
Run Code Online (Sandbox Code Playgroud)

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

  • 底线:Phones._ID == Contacts._ID (2认同)