2010-07-30 113 views
9

我试图在从内置活动中检索到他们的ID号后获取联系人的电话号码。但是,无论何时我在下面的代码中使用光标查询数据库 - 即使有我选择的联系人的手机号码,我也会返回零行。从Android中的URI检索联系人电话号码

任何人都可以指出我在更好的方向或显示如何获得联系人的电话号码后获取其用户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; 
} 

其中返回空的电话号码 - 这意味着它无法找到我想要访问的行 - 这意味着我的查询出了问题 - 但是,如果我检查了一个有手机号码的联系人 - 我怎么能获得0行查询?

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

回答

12

我找到了答案。

我没有得到来自任何光标行的原因是因为我用的是

ContactsContract.CommonDataKinds.Phone.CONTACT_ID 

行“在联系人表中的行的id,这个数据属于。”

因为我从联系人表中反正收到URI - 这不是必须的,下面的代码应该被替换。该ID是与电话表中的联系人对应的ID,而不是原始联系人。

ContactsContract.CommonDataKinds.Phone._ID 

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

+0

即使您的解释不清楚,这仍在起作用。为什么要电话CONTACT_ID(contact_id)不符合CONTACTS._ID(_id) – redochka 2011-12-04 13:32:05

+0

如果我这样解释它,可能会更容易:_ID是针对数据库的,'CONTACT_ID'是针对联系人ID,当您不查询特定表时。这有帮助吗? – hwrdprkns 2011-12-06 04:09:45

+2

底线:电话._ID ==联系人._ID – redochka 2011-12-06 23:00:52

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子句用于限制返回的数据。

+1

您复制了您在同一类型的其他问题上的答案(http://bit.ly/ayUbeg)。我看着这个问题,但我不应该因为我最初的意图而这样做。 – hwrdprkns 2010-07-30 19:39:09

相关问题