我的应用程序请求android.net.Uri
来自用户通过Intent.ACTION_CREATE_DOCUMENT
这边走:
Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TITLE, "fileName.txt");
startActivityForResult(intent, REQUEST_CODE_CREATE_FILE);
然后它接收 Uri(在onAtivityResult(...)
)并向其写入一些文本(通过PrintWriter
)。
在此阶段,我可以轻松地在文件管理器应用程序中查看文件,并通过适当的应用程序打开它。
但我无法通过我自己的应用程序打开它Intent.ACTION_VIEW
用这种方法:
Intent openFileIntent = new Intent(Intent.ACTION_VIEW);
openFileIntent.setDataAndType(fileUri, "text/plain");
openFileIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); //Or Intent.FLAG_GRANT_WRITE_URI_PERMISSION
openFileIntent = Intent.createChooser(openFileIntent, "Choose an app:");
startActivity(openFileIntent);
我选择的任何应用程序都会显示错误消息;就像是:
文件未找到
附:
虽然不是必需的,但这是我获取文件 Uri 并写入它的过程。
首先,我获取 Uri 并保留访问此 Uri 的权限onAtivityResult(...)
:
Uri fileUri = resultData.getData();
final int takeFlags = resultData.getFlags() & (Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
getActivity().getContentResolver().takePersistableUriPermission(fileUri, takeFlags);
Then a Writer
是通过这种方法创建的:
ParcelFileDescriptor pfd = getContentResolver().openFileDescriptor(fileUri, "w");
BufferedWriter out = new BufferedWriter( new FileWriter(pfd.getFileDescriptor()) );
PrintWriter writer = new PrintWriter(out);
最后,在向文件写入一些文本后,我关闭流:
writer.close();
pfd.close();