在 Android 11 中,应用程序需要通过特定的途径来访问内部存储的文件,否则会抛出 FileUriExposedException 异常。
为了解决这个问题,可以使用以下示例代码中的方法来打开文件选择器并获取所选文件的 Uri,然后使用 ContentResolver 打开文件。
首先,在 AndroidManifest.xml 文件中添加以下权限:
然后,在要访问内部存储文件的 Activity 中添加以下代码,以打开文件选择器并获取所选文件的 Uri。
private static final int REQUEST_CODE_OPEN_DOCUMENT = 2;
private void openFile() {
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.setType("*/*");
intent.addCategory(Intent.CATEGORY_OPENABLE);
startActivityForResult(intent, REQUEST_CODE_OPEN_DOCUMENT);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
if (requestCode == REQUEST_CODE_OPEN_DOCUMENT && resultCode == RESULT_OK && data != null) {
Uri uri = data.getData();
if (uri != null) {
// 使用 ContentResolver 打开文件
try {
InputStream inputStream = getContentResolver().openInputStream(uri);
// 处理文件流
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} else {
super.onActivityResult(requestCode, resultCode, data);
}
}
在上面的代码中,openFile() 方法用于启动文件选择器,onActivityResult() 方法中处理文件流。
需要注意的是,运行此代码需要将应用程序的 targetSdkVersion 设置为 30 或更高版本。
参考文献:https://developer.android.com/training/data-storage/use-cases#opt-out-scoped-storage