安卓11.ContentResolver.query返回空游标



我已经在应用程序中实现了从通讯录中选择联系人。为了让PICK在安卓11上工作,我将其添加到我的清单中:

<queries>
<intent>
<action android:name="android.intent.action.PICK" />
<data android:mimeType="vnd.android.cursor.dir/phone_v2" />
</intent>
</queries>

该代码在android版本10及以下版本上运行良好。但在android版本11上,我从电话簿中选择的联系人不会插入到我的应用程序的文本字段中,因为ContentResolver.query返回空光标。it.moveToFirst((返回false这是我的代码:

Constants.START_PICK_CONTACT_ACTION -> {
data?.data?.let { uri ->
activity.contentResolver.query(uri, null, null, null, null)?.use {
if (it.moveToFirst()) {
val number: String? = it.getString(it.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER))
etPhoneNumber.setText(number)
}
}
}
}

请帮帮我。

我也遇到过类似的问题。在尝试调用查询之前,需要授予android.Manifest.permission.READ_CONTACTS权限

我遇到了同样的问题。经过多次尝试,我发现:

a(请仔细检查您是否已在AndroidManifest.xml中声明了READ_CONTACTS权限。如果是,我们需要获得READ_CONTACTS的运行时权限。否则,ContentResolver.query((只返回一个空游标。

AndroidManifest.xml看起来像:

<manifest>
...
<uses-permission android:name="android.permission.READ_CONTACTS" />
...
<queries>
<intent>
<action android:name="android.intent.action.PICK" />
<data android:mimeType="vnd.android.cursor.dir/phone_v2" />
</intent>
</queries>
</manifest>

代码片段:

activity?.let {
if (ContextCompat.checkSelfPermission(it, Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED) {
//openContact()
} else {
requestPermissions(
arrayOf(Manifest.permission.READ_CONTACTS),
REQUEST_PERMISSION_READ_CONTACT_CODE
)
}
}
...
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
) {
// openContact()
}

b(如果清单中没有声明READ_CONTACTS权限,只需添加查询元素即可。

AndroidManifest.xml看起来像:

<manifest>
...
<uses-permission android:name="android.permission.READ_CONTACTS" />
...
<queries>
<intent>
<action android:name="android.intent.action.PICK" />
<data android:mimeType="vnd.android.cursor.dir/phone_v2" />
</intent>
</queries>
</manifest>

但我找不到任何文件可以解释这种行为,有人知道根本原因吗?如果你能告诉我,我将不胜感激。

最新更新