Cursor已加载全部联系人但获取的联系人名称为null问题咨询
解决联系人获取时name为null及数组操作的问题
我帮你梳理下代码里的几个关键问题,这些问题不仅会导致联系人名称为null,还可能引发其他异常:
数组未初始化且赋值逻辑错误:你只声明了
contact_names和mobile_numbers数组,但没有给它们分配内存空间,直接用contact_names[contact_names.length] = name会触发数组越界异常。而且数组长度固定,根本不适合动态添加联系人,建议换成ArrayList<String>来存储数据,它能自动扩容。Cursor遍历方式完全错误:原代码用
while (cursor.moveToFirst())会陷入死循环,因为每次循环都会把指针强制移到第一个联系人位置,永远不会遍历后续数据。正确的做法是先判断Cursor不为空,再移动到第一个元素,然后用do-while循环遍历所有条目。电话号码查询的条件写法错误:你把
contactId直接拼在查询条件里,这会导致SQL语法错误,无法正确匹配对应的联系人。应该用?作为占位符,然后通过selectionArgs数组传递参数,这样既安全又能保证查询准确。联系人名称字段可能过时:旧的
ContactsContract.Contacts.DISPLAY_NAME字段在部分新设备上可能返回null,建议改用DISPLAY_NAME_PRIMARY来获取联系人的主名称。
下面是修正后的完整代码:
// 改用ArrayList动态存储联系人名称和号码,避免数组越界问题 ArrayList<String> contactNames = new ArrayList<>(); ArrayList<String> mobileNumbers = new ArrayList<>(); // 先检查联系人读取权限(Android 6.0及以上必须动态申请) if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) { // 这里可以添加权限申请逻辑,比如调用ActivityCompat.requestPermissions return; } Cursor cursor = getActivity().getContentResolver().query( ContactsContract.Contacts.CONTENT_URI, null, null, null, null ); // 正确遍历Cursor的逻辑 if (cursor != null && cursor.moveToFirst()) { do { String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)); // 使用DISPLAY_NAME_PRIMARY获取更可靠的联系人名称 String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME_PRIMARY)); // 兜底处理:如果名称为空,设置默认值 if (name == null) { name = "未知联系人"; } contactNames.add(name); // 正确查询该联系人的电话号码 Cursor phones = getActivity().getContentResolver().query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", new String[]{contactId}, // 通过占位符传递参数 null ); if (phones != null) { while (phones.moveToNext()) { String number = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); mobileNumbers.add(number); } phones.close(); } } while (cursor.moveToNext()); cursor.close(); } // 如果需要转换成数组,可执行以下代码 String[] contact_names = contactNames.toArray(new String[0]); String[] mobile_numbers = mobileNumbers.toArray(new String[0]);
另外,别忘了在AndroidManifest.xml中添加静态权限声明:
<uses-permission android:name="android.permission.READ_CONTACTS" />
内容的提问来源于stack exchange,提问作者Keyur Sureliya
相关产品推荐
相关产品推荐

