Android选择PDF后跳转阅读器打开报ActivityNotFoundException如何解决
修复方案
核心问题点
- MIME类型配置错误:打开PDF的Intent中错误使用了
document/pdf,PDF文件对应的标准MIME类型为application/pdf - 缺少URI读取授权:通过
ACTION_OPEN_DOCUMENT获取的是ContentProvider格式的URI,未给目标PDF阅读器授予读取权限,第三方应用无法访问该URI - 无Intent可用性校验:未判断设备上是否存在可处理PDF打开请求的应用,直接调用
startActivity会直接抛出异常 - (可选)安卓11+包可见性限制:targetSdkVersion≥30时,默认无法扫描到设备上的第三方PDF应用,需要额外配置清单声明
修复后的代码
1. onActivityResult逻辑修改
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) if (resultCode == Activity.RESULT_OK && requestCode == R.integer.request_code_pdf) { data?.data?.also { uri -> val openPdfIntent = Intent(Intent.ACTION_VIEW) // 修正为正确的PDF MIME类型 openPdfIntent.setDataAndType(uri, "application/pdf") // 给目标应用授予URI读取权限 openPdfIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) openPdfIntent.flags = Intent.FLAG_ACTIVITY_NO_HISTORY // 先校验是否有应用可处理该请求,避免崩溃 if (openPdfIntent.resolveActivity(packageManager) != null) { startActivity(openPdfIntent) } else { Toast.makeText(this, "请先安装PDF阅读器应用", Toast.LENGTH_SHORT).show() } } // 如需支持多选PDF,可补充以下逻辑 /* data?.clipData?.let { clipData -> for (i in 0 until clipData.itemCount) { val pdfUri = clipData.getItemAt(i).uri // 逐个处理选中的PDF文件 } } */ } }
2. 安卓11+额外配置
如果你的项目targetSdkVersion ≥ 30,需要在AndroidManifest.xml的根节点下添加包可见性声明:
<queries> <intent> <action android:name="android.intent.action.VIEW" /> <data android:mimeType="application/pdf" /> </intent> </queries>
补充说明
你打印的content://com.android.providers.downloads.documents/document/msf%3A462052格式URI是正常的,ACTION_OPEN_DOCUMENT返回的是系统文档Provider提供的安全URI,不需要转换为本地文件路径,按上述方案配置后第三方应用可以正常访问。
内容的提问来源于stack exchange,提问作者Gasgano
相关产品推荐
相关产品推荐

