从存储中选择一个 pdf 并使用 pdf 应用程序打开它

Posted

技术标签:

【中文标题】从存储中选择一个 pdf 并使用 pdf 应用程序打开它【英文标题】:Choose a pdf from storage and open it with a pdf app 【发布时间】:2021-10-07 03:32:09 【问题描述】:

我喜欢从存储中选择一个 pdf 文件。之后,它应该使用用户选择的 pdf 阅读器应用程序打开选择的 pdf 文件。我可以选择一个文件,但之后应用程序崩溃并抛出:

android.content.ActivityNotFoundException: No Activity found to handle Intent

我试过了:

override fun onCreate(savedInstanceState: Bundle?) 
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main_menu)

    btnTravels.setOnClickListener 
        val intent = Intent(Intent.ACTION_OPEN_DOCUMENT)
        //val intent = Intent(Intent.ACTION_GET_CONTENT)
        intent.type = "application/pdf"
        intent.addCategory(Intent.CATEGORY_OPENABLE)
        intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true)
        startActivityForResult(intent, R.integer.request_code_pdf)
    


override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) 
    super.onActivityResult(requestCode, resultCode, data)

    if (resultCode == Activity.RESULT_OK) 
        if (requestCode == R.integer.request_code_pdf) 
            if (data != null) 

                Log.i("gotresult", data.data.toString())

                data.data?.also uri ->
                    val intent = Intent(Intent.ACTION_VIEW)
                    intent.setDataAndType(uri,"document/pdf")
                    intent.flags = Intent.FLAG_ACTIVITY_NO_HISTORY
                    startActivity(intent)
                
            
        
    

Log.i 向我展示了这一点。它看起来不像是文件名:

content://com.android.providers.downloads.documents/document/msf%3A462052

【问题讨论】:

【参考方案1】:

替换:

                val intent = Intent(Intent.ACTION_VIEW)
                intent.setDataAndType(uri,"document/pdf")
                intent.flags = Intent.FLAG_ACTIVITY_NO_HISTORY
                startActivity(intent)

与:

                val intent = Intent(Intent.ACTION_VIEW, uri)
                intent.flags = Intent.FLAG_GRANT_READ_URI_PERMISSION
                startActivity(intent)

document/pdf 不是有效的 MIME 类型,您需要授予查看器应用读取内容的权限。

另外,删除intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true),因为您没有处理多个文档。

它看起来不像是文件名

它不应该是一个文件名。它应该是一个Uri 指向用户通过ACTION_OPEN_DOCUMENT 选择的文档。

【讨论】:

以上是关于从存储中选择一个 pdf 并使用 pdf 应用程序打开它的主要内容,如果未能解决你的问题,请参考以下文章

Android 从 URL 下载 PDF,然后使用 PDF 阅读器打开它

如何从内部存储中选择文档和图像文件并上传到服务器?

Flutter Web - 如何选择 PDF 文件并 POST 到 API?

Mac备忘录内容怎么做成PDF文档

使用Google应用脚本从PDF到文本转换获取文本

将存储在iphone中的pdf文件上传到ios中的服务器