【发布时间】:2022-02-14 21:00:34
【问题描述】:
在我的应用程序中,我有几个文件 Uri(不是 URI)存储。这些是以下形式:
content://com.android.providers.downloads.documents/document/427
我的意图是,一旦我单击一个按钮,在文件阅读器中打开其中一个 Uri(可能是 MS Word、Excel、PDF 阅读器......取决于扩展名和设备)。
我目前正在尝试这个 sn-p:
val file = File(Uri.parse(uri).path!!)
val myMime: MimeTypeMap = MimeTypeMap.getSingleton()
val newIntent = Intent(Intent.ACTION_VIEW)
val mimeType: String = myMime.getMimeTypeFromExtension(file.extension).toString()
newIntent.setDataAndType(
FileProvider.getUriForFile(applicationContext, "${applicationContext.packageName}.provider", file), mimeType)
newIntent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
newIntent.flags = Intent.FLAG_GRANT_READ_URI_PERMISSION
try {
startActivity(newIntent)
} catch (e: ActivityNotFoundException) {
}
但每次我尝试打开它时,我都会得到:
java.lang.IllegalArgumentException: Failed to find configured root that contains /document/427
你能告诉我我错过了什么吗?我在这里找到的没有针对我的问题的答案。提前致谢!
更新 感谢@CommonsWare 的帮助,我设法避免了异常,我的代码现在看起来像这样:
val newIntent = Intent(Intent.ACTION_VIEW)
newIntent.addCategory(Intent.CATEGORY_OPENABLE)
newIntent.data = Uri.parse(uri)
newIntent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
newIntent.flags = Intent.FLAG_GRANT_READ_URI_PERMISSION
try {
startActivity(newIntent)
} catch (e: ActivityNotFoundException) {
Toast.makeText(this, e.toString(), Toast.LENGTH_LONG).show()
}
我从这里获取 Uri:
val fileResultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
viewModel.uploadFile(result, false)
}
fileFab.setOnClickListener {
val intent = Intent()
intent.type = "application/*"
intent.action = Intent.ACTION_OPEN_DOCUMENT
fileResultLauncher.launch(intent)
}
不幸的是,我收到了NoActivityFoundException
【问题讨论】:
-
尝试自己打开并阅读 uri,然后再尝试让其他应用执行此操作。我敢打赌,您的应用程序已经不允许打开它。使用 getContentResolver().openInputStream(uri) 然后从流中读取。
-
它是文档(docx、xlsx、pdf...)文件的 uri。我真的不能不使用另一个应用程序来打开它。
-
????你说的根本没有意义。您要求使用另一个应用程序:
How to open a file in another app via an Intent using an URI?
标签: android file kotlin filesystems document