从Android 10(API级别29)开始,Android系统引入了存储访问框架(Storage Access Framework,SAF),在Android 11(API级别30)和Android 12(API级别31)中对其进行了进一步的增强。在Android 13中,SAF不再是可选的,并且应用程序必须使用它来读取媒体文件。
因此,如果您在应用程序中使用的是旧方法来读取媒体图像文件并且它没有被更新以使用SAF,则您需要更新该应用程序以使用SAF来读取媒体文件。下面是一个示例代码片段,展示如何使用SAF来读取图像文件:
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.setType("image/*");
startActivityForResult(intent, REQUEST_CODE_IMPORT_IMAGE);
@Override
protected void onActivityResult(int requestCode, int resultCode,Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE_IMPORT_IMAGE && resultCode == Activity.RESULT_OK) {
Uri imageUri = data.getData();
InputStream inputStream = null;
try {
inputStream = getContentResolver().openInputStream(imageUri);
// 从输入流中读取图像文件
// ...
} catch (IOException e) {
e.printStackTrace();
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
注意:您需要在AndroidManifest.xml文件中添加以下权限:
同时,在AndroidManifest.xml文件中也需要为您的应用程序添加以下XML声明,以便系统知道您的应用程序将使用SAF:
...
最后,您还需要记住在运行时请求读取存储权限。以下是一个示例代码片段,展示如何在运行时请求读取存储权限:
private static final int REQUEST_CODE_READ_STORAGE_PERMISSION = 1000;
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.READ_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(this,
Manifest.permission.READ_EXTERNAL_STORAGE)) {
// 显示解释权限请求的UI
// …
} else {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
REQUEST_CODE_READ_STORAGE_PERMISSION);
}
} else {
// 已经有存储权限了
// …
}
@Override
public void onRequestPermissionsResult(int requestCode,
String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_CODE_READ_STORAGE_PERMISSION) {
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 已经授予了存储权限
// …
} else {
// 没有授予存储权限
// …
}
}
}
在您的应用程序中使用这些代码片段,并确保遵循了SAF指南和Android 13的最佳做法