拔出头发大约一个星期后,我终于完成工作并准备寻求帮助。
基本上,在我的应用程序中,我使用下面的Intent创建一个新的PDF,这是通过Storage Access Framework完成的。
val intent = Intent(Intent.ACTION_CREATE_DOCUMENT)
intent.addCategory(Intent.CATEGORY_OPENABLE)
intent.type = "application/pdf"
intent.putExtra(Intent.EXTRA_TITLE, title)
startActivityForResult(intent, 1234)
之后,我在onActivityResult()方法上获得Uri,如下所示:
uri = dataIntent.data
if (uri != null) {
val takeFlags = data.flags and (Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
contentResolver.takePersistableUriPermission(uri, takeFlags)
generatePdf(uri)
}
PDF生成是可以的,当我需要调用ACTION_VIEW以便用户查看生成的文件或使用ACTION_SEND共享文件时,就会出现问题。
ACTION_VIEW用法示例(是的,我同时使用Kotlin和Java):
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.setDataAndType(uri, mimeType);
startActivity(intent);
我一生都无法弄清楚如何获得另一个应用程序可以使用的Uri。
到目前为止我尝试过的事情:
如果有人可以阐明这个问题,我们将不胜感激。
答案 0 :(得分:0)
原则上使用与创建文件时相同的uri。但是...您无法授予该uri的读取uri权限。你说对了。但是您不能将这样的许可转发给文档的查看者。
相反,您应该实现ContentProvider。然后,您可以提供文件的内容。
答案 1 :(得分:0)
就像blackapps在回应中说的那样,我要做的是实现ContentProvider,更具体地说是实现DocumentProvider。
最后完成此操作的是this link和this link。我实现了一个CustomDocumentProvider,它在应用程序的私有文件(context.getFilesDir()。getAbsolutePath()+“ / folderToExpose”)中公开一个文件夹,此文件夹中创建的所有文件都公开之后,其他应用程序可以使用ACTION_VIEW和ACTION_SEND一般。
如果有人碰巧遇到了此问题,只需确保要公开的文件夹中不包含任何对您的应用至关重要的文件(例如数据库文件),因为用户将可以完全访问其所有内容。如果是新文件夹,请确保通过调用mkdirs()来创建它。