在Android 10中,存储访问框架发生了变化,需要使用新的API来获取uri的游标数据。以下是一个使用ContentResolver获取uri的游标数据的示例解决方法:
// 检查运行时权限(需要在Android 6.0及以上版本中使用)
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
// 已授予读取外部存储权限,可以继续操作
performReadFromStorage();
} else {
// 请求读取外部存储权限
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == 1) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 用户授予了读取外部存储权限
performReadFromStorage();
} else {
// 用户拒绝了读取外部存储权限
Toast.makeText(this, "需要读取外部存储权限才能继续操作", Toast.LENGTH_SHORT).show();
}
}
}
private void performReadFromStorage() {
// 获取要查询的Uri(例如,查询图片的Uri)
Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
// 定义要查询的字段
String[] projection = {MediaStore.Images.ImageColumns._ID, MediaStore.Images.ImageColumns.DISPLAY_NAME};
// 使用ContentResolver查询数据
ContentResolver contentResolver = getContentResolver();
Cursor cursor = contentResolver.query(uri, projection, null, null, null);
// 处理查询结果
if (cursor != null && cursor.moveToFirst()) {
do {
// 通过游标获取数据
long id = cursor.getLong(cursor.getColumnIndex(MediaStore.Images.ImageColumns._ID));
String displayName = cursor.getString(cursor.getColumnIndex(MediaStore.Images.ImageColumns.DISPLAY_NAME));
// 在这里可以对获取到的数据进行处理
Log.d("TAG", "id: " + id + ", displayName: " + displayName);
} while (cursor.moveToNext());
}
// 关闭游标
if (cursor != null) {
cursor.close();
}
}
以上示例代码演示了如何使用ContentResolver获取指定uri的游标数据。你可以根据自己的需求修改查询的Uri和要查询的字段,以及对获取到的数据进行相应处理。