在Android 10中,作用域存储行为发生了变化,这意味着应用只能访问其私有目录以外的文件的访问权限有所限制。下面是一些解决方法和代码示例:
// 需要在AndroidManifest.xml中添加读取媒体文件的权限:
//
String[] projection = {MediaStore.Images.Media._ID, MediaStore.Images.Media.DISPLAY_NAME};
String selection = null;
String[] selectionArgs = null;
String sortOrder = MediaStore.Images.Media.DISPLAY_NAME + " ASC";
Cursor cursor = getContentResolver().query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
projection,
selection,
selectionArgs,
sortOrder
);
if (cursor != null) {
while (cursor.moveToNext()) {
String displayName = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DISPLAY_NAME));
// 处理媒体文件
}
cursor.close();
}
// 需要在AndroidManifest.xml中添加访问外部文件的权限:
//
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("*/*");
startActivityForResult(intent, REQUEST_CODE);
然后在onActivityResult
方法中获取文件URI:
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
if (data != null) {
Uri uri = data.getData();
// 处理文件URI
}
}
}
requestLegacyExternalStorage
属性:
...
此属性可以将应用的存储行为还原为Android 9及以下版本的行为,允许应用访问共享的外部存储空间。但请注意,这只是一种临时解决方法,应尽快迁移到更安全的存储解决方案。