我正在尝试从内置活动中检索到其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行查询?
非常感谢任何帮助。非常感谢你!
答案 0 :(得分:12)
我找到了答案。
我没有从光标获取任何行的原因是因为我使用的是
行ContactsContract.CommonDataKinds.Phone.CONTACT_ID
“此数据所属的Contacts表中行的ID。”
因为我还是从联系人表中获取URI - 这不是必需的,应该替换以下内容。 ID是与电话表中的联系人相对应的ID,而不是原始联系人。
ContactsContract.CommonDataKinds.Phone._ID
交换行在查询中返回了正确的结果。目前一切似乎都运转良好。
答案 1 :(得分: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子句用于限制返回的数据。