在Android 11中,ContentResolver.query返回空游标的问题可能是由于应用的URI权限限制所致。在Android 11中,应用默认只能访问自身的应用数据,需要通过URI权限来访问其他应用的数据。
要解决此问题,需要在查询之前添加URI权限。以下是一个示例代码,演示如何添加URI权限来查询其他应用的数据:
// 定义URI权限常量
private static final String READ_CONTACTS_PERMISSION = "android.permission.READ_CONTACTS";
// 检查应用是否具有读取联系人权限
if (ContextCompat.checkSelfPermission(context, READ_CONTACTS_PERMISSION) == PackageManager.PERMISSION_GRANTED) {
// 创建查询联系人的URI
Uri uri = ContactsContract.Contacts.CONTENT_URI;
// 添加URI权限
uri = uri.buildUpon().appendQueryParameter(ContactsContract.DIRECTORY_PARAM_KEY, String.valueOf(ContactsContract.Directory.DEFAULT)).build();
// 执行查询
Cursor cursor = context.getContentResolver().query(uri, null, null, null, null);
// 处理游标数据
if (cursor != null && cursor.moveToFirst()) {
// 处理查询结果
// ...
}
// 关闭游标
if (cursor != null) {
cursor.close();
}
} else {
// 请求读取联系人权限
ActivityCompat.requestPermissions(activity, new String[]{READ_CONTACTS_PERMISSION}, PERMISSION_REQUEST_CODE);
}
在上面的示例代码中,首先检查应用是否具有读取联系人权限。如果没有权限,则请求权限。如果已经具有权限,则创建用于查询联系人的URI,并添加URI权限。然后执行查询,并处理游标数据。
请注意,您需要在AndroidManifest.xml文件中添加适当的权限声明,以便在运行时请求权限。
希望这可以帮助您解决在Android 11中ContentResolver.query返回空游标的问题。