在Android 11中,应用程序需要处理与存储访问框架(SAF)相关的更改。在访问不在应用专用存储空间中的文件时,应使用SAF而不是直接使用文件路径进行访问。
以下代码示例演示如何通过使用SAF从文件选择器打开docx文件:
private static final int REQUEST_CODE_OPEN_DOCUMENT = 2;
public void openWordDocument() {
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("*/*"); // set MIME type to filter files
intent.putExtra(Intent.EXTRA_TITLE, "Open Word File");
startActivityForResult(intent, REQUEST_CODE_OPEN_DOCUMENT);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent resultData) {
super.onActivityResult(requestCode, resultCode, resultData);
if (requestCode == REQUEST_CODE_OPEN_DOCUMENT && resultCode == Activity.RESULT_OK) {
Uri uri = resultData.getData();
String path = getFilePathFromURI(getActivity(), uri);
openDocxFileWithIntent(path);
}
}
private String getFilePathFromURI(Context context, Uri uri) {
String filePath = "";
if (uri.getScheme().equals("file")) {
filePath = uri.getPath();
} else {
try {
ParcelFileDescriptor pfd = context.getContentResolver().openFileDescriptor(uri, "r");
if (pfd != null) {
FileDescriptor fd = pfd.getFileDescriptor();
filePath = context.getCacheDir().getAbsolutePath() + "/" + uri.getLastPathSegment();
FileOutputStream fos = new FileOutputStream(filePath);
FileInputStream fis = new FileInputStream(fd);
byte[] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer)) != -1) {
fos.write(buffer, 0, len);
}
fis.close();
fos.close();
pfd.close();
fd.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
return filePath;
}
private void openDocxFileWithIntent(String filePath) {
if (!filePath.isEmpty()) {
File file = new File(filePath);
Intent intent =