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

Posted

技术标签:

【中文标题】从 Android 中的 URI 检索联系人电话号码【英文标题】:Retrieve Contact Phone Number From URI in Android 【发布时间】:2011-03-23 04:30:11 【问题描述】:

在我从内置活动中检索到他们的 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

从中我将 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;

它为电话号码返回 null ——这意味着它找不到我试图访问的行——这意味着我的查询有问题——但是如果我检查一个有手机号码的联系人-- 我怎样才能得到一个 0 行的查询?

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

【问题讨论】:

【参考方案1】:

我找到了答案。

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

ContactsContract.CommonDataKinds.Phone.CONTACT_ID

“联系人表中该数据所属行的id。”

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

ContactsContract.CommonDataKinds.Phone._ID

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

【讨论】:

即使您的解释不清楚,这也是有效的。为什么 Phone.CONTACT_ID (contact_id) 不匹配 CONTACTS._ID (_id) 如果我这样解释可能会更容易:_ID 用于数据库,CONTACT_ID 用于不查询特定表时的联系人 ID。这有帮助吗? 底线:Phones._ID == Contacts._ID【参考方案2】:

这应该可行,(也许尝试丢失类型)

电话号码存储在自己的表中,需要单独查询。要查询电话号码表,请使用 SDK 变量 ContactsContract.CommonDataKinds.Phone.CONTENT_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 联系人 SQLite 数据库执行第二次查询。根据存储在 ContactsContract.CommonDataKinds.Phone.CONTENT_URI 中的 URI 查询电话号码。联系人 ID 作为 ContactsContract.CommonDataKinds.Phone.CONTACT_ID 存储在电话表中,WHERE 子句用于限制返回的数据。

【讨论】:

您复制了您在其他同类型问题上的答案 (bit.ly/ayUbeg)。我看了那个问题,但由于我最初的意图,我不应该这样做。

以上是关于从 Android 中的 URI 检索联系人电话号码的主要内容,如果未能解决你的问题,请参考以下文章

从android中的电话簿中检索whatsapp联系人

Android 手机联系人仅包含照片、电话和姓名

安卓。通过电话号码从通讯录中检索名字和姓氏

从 Android 联系人中检索电话号码在三星上不起作用

在 Android 上检索联系人图像

仅从 android 中检索电话号码包含 123 的联系人