我正在尝试获取特定联系人的电话号码。我可以获取联系人姓名,但不知何故,当我尝试获取电话号码时出现错误。
我已将权限放入 androidManifest.xml 中:
<uses-permission android:name="android.permission.READ_CONTACTS" />
当我运行以下代码时: `ContactInfo contactInfo = null;
String[] projection = {
ContactsContract.CommonDataKinds.Phone._ID,
ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
ContactsContract.CommonDataKinds.Phone.NUMBER
};
try (Cursor cursor = getContentResolver().query(contactUri, null, null, null, null)) {
if (cursor != null && cursor.moveToFirst()) {
String[] columnNames = cursor.getColumnNames();
for (int i = 0; i < columnNames.length; i++) {
Log.d("Info SMS", "Column " + i + ": " + columnNames[i] + ", value :" + cursor.getString(i));
}
int idIndex = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone._ID);
int nameIndex = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME_PRIMARY);
int phoneNumberIndex = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
Log.d("Info SMS", "ID Index : " + String.valueOf(idIndex));
Log.d("Info SMS", "Name Index : " + String.valueOf(nameIndex));
Log.d("Info SMS", "Phone Index : " + String.valueOf(phoneNumberIndex));
Log.d("Info SMS", "Index okay");
String name = cursor.getString(nameIndex);
Log.d("Info SMS Name", "Name :" + name);
String phoneNumber = cursor.getString(phoneNumberIndex);
Log.d("Info SMS", phoneNumber);
contactInfo = new ContactInfo(name, phoneNumber);
}
} catch (Exception e) {
Log.d("Info SMS Error", Arrays.toString(e.getStackTrace()));
}
Log.d("Info SMS", String.valueOf(contactInfo));
return contactInfo;`
我有一个错误:
[android.database.CursorWindow.nativeGetString(Native Method), android.database.CursorWindow.getString(CursorWindow.java:465), android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:54), android.database.CursorWrapper.getString(CursorWrapper.java:141), fr.e1k.sms_sender.MainActivity.retrieveContactInfo(MainActivity.java:142), fr.e1k.sms_sender.MainActivity.lambda$onCreate$0$fr-e1k-sms_sender-MainActivity(MainActivity.java:60), fr.e1k.sms_sender.MainActivity$$ExternalSyntheticLambda0.onActivityResult(Unknown Source:4), androidx.activity.result.ActivityResultRegistry.doDispatch(ActivityResultRegistry.java:418), androidx.activity.result.ActivityResultRegistry.dispatchResult(ActivityResultRegistry.java:375), androidx.activity.ComponentActivity.onActivityResult(ComponentActivity.java:793), androidx.fragment.app.FragmentActivity.onActivityResult(FragmentActivity.java:164), android.app.Activity.dispatchActivityResult(Activity.java:8628), android.app.ActivityThread.deliverResults(ActivityThread.java:5316), android.app.ActivityThread.handleSendResult(ActivityThread.java:5362),android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:67), android.app.servertransaction.ActivityTransactionItem.execute(ActivityTransactionItem.java:45), android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135), android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95), android.app.ActivityThread$H.handleMessage(ActivityThread.java:2307), android.os.Handler.dispatchMessage(Handler.java:106), android.os.Looper.loopOnce(Looper.java:201), android.os.Looper.loop(Looper.java:288), android.app.ActivityThread.main(ActivityThread.java:7872), java.lang.reflect.Method.invoke(Native Method), com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548), com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)]
错误就在这一行:
String phoneNumber = cursor.getString(phoneNumberIndex);
因为phoneNumberIndex是
Phone Index : -1
。
我通过这些行知道了这些信息:
int phoneNumberIndex = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
Log.d("Info nbSMS", "Phone Index : " + String.valueOf(phoneNumberIndex));
确实,通过这个循环和 logcat :
String[] columnNames = cursor.getColumnNames();
for (int i = 0; i < columnNames.length; i++) {
Log.d("Info nbSMS", "Column " + i + ": " + columnNames[i] + ", value :" + cursor.getString(i));
}
我只能访问联系人的以下信息:
Column 0: last_time_contacted, value :0
Column 1: phonetic_name, value :null
Column 2: custom_ringtone, value :null
Column 3: contact_status_ts, value :null
Column 4: pinned, value :0
Column 5: photo_id, value :null
Column 6: photo_file_id, value :null
Column 7: contact_status_res_package, value :null
Column 8: contact_chat_capability, value :null
Column 9: contact_status_icon, value :null
Column 10: display_name_alt, value :Test
Column 11: sort_key_alt, value :Test
Column 12: in_visible_group, value :1
Column 13: starred, value :0
Column 14: contact_status_label, value :null
Column 15: phonebook_label, value :T
Column 16: is_user_profile, value :0
Column 17: has_phone_number, value :1
Column 18: display_name_source, value :40
Column 19: phonetic_name_style, value :0
Column 20: send_to_voicemail, value :0
Column 21: lookup, value :0r1-50324E50
Column 22: phonebook_label_alt, value :T
Column 23: contact_last_updated_timestamp, value :1692316538974
Column 24: photo_uri, value :null
Column 25: phonebook_bucket, value :20
Column 26: contact_status, value :null
Column 27: display_name, value :Test
Column 28: sort_key, value :Test
Column 29: photo_thumb_uri, value :null
Column 30: contact_presence, value :null
Column 31: in_default_directory, value :1
Column 32: times_contacted, value :0
Column 33: _id, value :1
Column 34: name_raw_contact_id, value :1
Column 35: phonebook_bucket_alt, value :20
电话号码什么也没有。
我阅读了官方文档,但它对我没有多大帮助。 (https://developer.android.com/training/contacts-provider/retrieve-details)。
我还检查了这个主题:Android从联系人列表中获取电话号码 但它对我不起作用。
我也看了这个老话题: 获取联系电话
我尝试这样安排:
if (Integer.parseInt(cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {
Cursor pCur = getContentResolver().query(contactUri,null,ContactsContract.CommonDataKinds.Phone._ID +" = ?", new String[]{cursor.getString(idIndex)}, null);
String phone = cursor.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
Log.d("Info nbSMS", "Phone Number: " + phone);
}
`
但仍然是同样的错误。
我还查看了有关堆栈溢出的其他一些旧主题,但仍然是同样的事情......
所以我可能会错过一些东西。你知道我所有问题的根源是什么吗?
这是我在 stackoverflow 上的第一篇文章,所以我可能错过了一些您需要的重要信息。请告诉我缺少什么。或者也许我不理解我找到的解决方案之一。
感谢您的宝贵时间。
您还需要许可:
<uses-permission android:name="android.permission.READ_CALL_LOG"/>
否则查询无法填写数字字段。并非在所有设备上,但在相当多的设备上。