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

我正在尝试从内置活动中获取联系人的电话号码。 但是,每当我在下面的代码中使用光标查询数据库时 – 即使有我select的联系人的手机号码,我也会返回零行。

任何人都可以指出我在一个更好的方向,或显示如何获得联系人的电话号码获取其用户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)传递到一个方法,该方法devise为从具有给定types的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行查询?

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

Solutions Collecting From Web of "在Android中从URI中检索联系人电话号码"

我find了答案。

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

 ContactsContract.CommonDataKinds.Phone.CONTACT_ID 

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

因为我从联系人表中获取URI – 这不是必须的,下面的代码应该被replace。 该ID是与电话表中的联系人对应的ID,而不是原始联系人。

 ContactsContract.CommonDataKinds.Phone._ID 

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

这应该工作,(也许尝试失去的types)

电话号码存储在自己的表中,需要单独查询。 要查询电话号码表,请使用存储在SDKvariablesContactsContract.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子句用于限制返回的数据。