Android Studio (Java):从联系人(电话号码)获取信息

问题描述 投票:0回答:1

我正在尝试获取特定联系人的电话号码。我可以获取联系人姓名,但不知何故,当我尝试获取电话号码时出现错误。

我已将权限放入 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 上的第一篇文章,所以我可能错过了一些您需要的重要信息。请告诉我缺少什么。或者也许我不理解我找到的解决方案之一。

感谢您的宝贵时间。

java android contacts
1个回答
0
投票

您还需要许可:

<uses-permission android:name="android.permission.READ_CALL_LOG"/>

否则查询无法填写数字字段。并非在所有设备上,但在相当多的设备上。

© www.soinside.com 2019 - 2024. All rights reserved.