可以使用ACTION_OPEN_DOCUMENT解决该问题。下面是相关示例代码:
在Manifest文件中添加以下权限:
在需要打开文件的Activity中添加以下代码:
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
public void onActivityResult(int requestCode, int resultCode, Intent resultData) {
if (requestCode == REQUEST_CODE_OPEN_DOCUMENT
&& resultCode == Activity.RESULT_OK
&& resultData != null) {
Uri uri = resultData.getData();
// 根据Uri获取文件路径示例代码:
String path = getRealPathFromURI(this, uri);
// 打开文件示例代码:
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.parse(path), "application/pdf");
startActivity(intent);
}
}
private String getRealPathFromURI(Context context, Uri uri) {
String filePath = "";
if (uri.getScheme().compareTo("content") == 0) {
Cursor cursor = context.getContentResolver().query(uri,
new String[] { android.provider.MediaStore.Images.ImageColumns.DATA },
null, null, null);
cursor.moveToFirst();
filePath = cursor.getString(0);
cursor.close();
} else {
filePath = uri.getPath();
}
return filePath;
}
在onActivityResult方法中处理返回的文件Uri,并调用getRealPathFromURI方法将Uri转为文件路径,然后可以使用该路径打开文件。注意:在Android 11中对外部存储的访问需要使用特殊权限,在查询Uri的数据时要使用MediaStore API。