【问题标题】:Shortcut Doesn't Launch The File In Android Q快捷方式不会在 Android Q 中启动文件
【发布时间】:2019-12-10 20:27:58
【问题描述】:

编辑:

当我点击固定的快捷方式时,我在system_process 的登录下方:

2019-10-26 20:00:16.086 2047-3533/system_process I/ActivityTaskManager: START u0 {act=android.intent.action.VIEW dat=file:///storage/emulated/0/Download/AAD.pdf typ=application/pdf flg=0x10000000 cmp=com.google.android.apps.docs/com.google.android.apps.viewer.PdfViewerActivity bnds=[439,84][641,337]} from uid 10147
2019-10-26 20:00:16.100 2047-2047/system_process W/ActivityManager: Unable to start service Intent { act=android.service.appprediction.AppPredictionService cmp=com.google.android.as/com.google.android.apps.miphone.aiai.app.AiAiPredictionService } U=0: not found
2019-10-26 20:00:16.100 2047-2047/system_process W/RemoteAppPredictionService: could not bind to Intent { act=android.service.appprediction.AppPredictionService cmp=com.google.android.as/com.google.android.apps.miphone.aiai.app.AiAiPredictionService } using flags 67108865

简而言之,固定快捷方式不会在 Android 10 中打开,但可以在旧版本中使用。在 Android 10 中,当我单击快捷方式时,Drive PDF Viewer 会打开,但实际文件显示为黑色空间,并在一秒钟内关闭应用程序。

旧:

我的 Android 应用程序的目标是 API 级别 28。它将 PDF 文件的快捷方式固定到主屏幕,单击图标会明显打开文件。直到 Android Pie,它工作得非常好。但是当我在 API 29 上对其进行测试时,单击该图标会打开 PDF 查看器并强制关闭且没有错误。这是相关代码。

private fun addShortcutInOreo(path1: String, pdfName: String) {
        val file = File(path1)
        try {
            Log.d("Data", file.path)
            val pdfIntent = Intent(Intent.ACTION_VIEW)

            val uri = Uri.fromFile(file)

            pdfIntent.setDataAndType(uri, "application/pdf")
            pdfIntent.flags = Intent.FLAG_GRANT_READ_URI_PERMISSION
            pdfIntent.flags = Intent.FLAG_GRANT_WRITE_URI_PERMISSION

            Log.d("DataPath", uri.path)
            Log.d("DataPath", pdfName)

            if (Build.VERSION.SDK_INT > 25) {
                val shortcutManager = getSystemService(ShortcutManager::class.java)

                // Check which icon is to be pinned
                image = if (blueIcon.isChecked)
                    R.drawable.pdf
                else
                    R.drawable.pdf2

                // Create a shortcut
                val shortcut = ShortcutInfo.Builder(this, pdfName)
                        .setShortLabel(pdfName)
                        .setLongLabel(pdfName)
                        .setIcon(Icon.createWithResource(this, image))
                        .setIntent(pdfIntent)
                        .build()

                shortcutManager.requestPinShortcut(shortcut, null)
            }
        } catch (e: Exception) {
            errorMessage(e)
        }

    }

记录的数据在这里。第一行显示文件路径。第二行显示 Uri。第三行简单地给出了提取的文件名。我这样做只是为了检查我的代码是否一切正常。

2019-08-02 13:43:14.160 3306-3306/com.parassidhu.pdfpin D/Data: /storage/emulated/0/Download/Nakal.pdf
2019-08-02 13:43:14.160 3306-3306/com.parassidhu.pdfpin D/DataPath: file:///storage/emulated/0/Download/Nakal.pdf
2019-08-02 13:43:14.160 3306-3306/com.parassidhu.pdfpin D/DataPath: Nakal

API 28 的日志相同:

2019-08-02 13:55:07.853 5341-5341/com.parassidhu.pdfpin D/Data: /storage/emulated/0/Download/Nakal.pdf
2019-08-02 13:55:07.853 5341-5341/com.parassidhu.pdfpin D/DataPath: file:///storage/emulated/0/Download/Nakal.pdf
2019-08-02 13:55:07.853 5341-5341/com.parassidhu.pdfpin D/DataPath: Nakal

由于没有错误,我正在挠头,因为可能出了什么问题。我已阅读有关 Android Q 中的 Scoped Storage 的信息,但这不适用于这里,因为我不是针对 Q

可能是什么问题?感谢阅读!

【问题讨论】:

    标签: android android-shortcutmanager


    【解决方案1】:

    Uri.fromFile() 自 Android 7.0 以来已被有效禁止,因为它会触发 FileUriExposedException。

    在您的应用中使用FileProvider 并使用FileProvider.getUriForFile() 创建Uri 以在您的Intent 中使用。

    【讨论】:

    • 我没有得到这个异常,我已经尝试过了。对我没用。
    • @ParasSidhu:“我没有得到这个异常”——你不会,因为你的进程不是启动活动的那个。 “对我没用”——无论如何你都需要它,因为很少有应用程序会回复 ACTION_VIEW 以获得 file Uri。另外,FLAG_GRANT_READ_URI_PERMISSION 和 FLAG_GRANT_WRITE_URI_PERMISSION 仅适用于 content Uri。
    • 没错,明白了。我在system_processes 中检查了更多幕后情况,但没有发现任何相关错误。
    • 我想我已经在您的帮助下解决了这个问题。使用FileProvider.getUriForFile() 方法并使用addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) 而不是setFlags() 就可以了。我将进行测试以获得更全面的确认,如果之后运行良好,我将奖励您:)
    • @ParasSidhu:啊,是的——这是 Kotlin 简化语法的缺点之一(结合 Google 倾向于使用位域而不是 enum 值作为标志)。我应该注意到这一点,我很抱歉在我之前的评论中错过了它。我很高兴听到你的工作!
    【解决方案2】:

    感谢@CommonsWare 的提示,我解决了这个问题。我做了两处改动:

    1. 对于 Android 7.0 及更高版本,我使用 @CommonsWare 建议的 FileProvider.getUriForFile() 而不是 Uri.fromFile()。

    2. 我没有使用setFlags()(在Kotlin的语法中,它是intent.flags = <flag>),而是使用addFlags()并传递了Intent.FLAG_GRANT_READ_URI_PERMISSION。

    说明:

    1. 第一个更改是非常必要的,因为在 Android 7.0+ 上使用 Uri.fromFile() 方法会导致 FileUriExposedException。不在应用程序中,因为单击快捷方式时,启动的活动不属于我的应用程序。这就是为什么我无法抓住它。

    2. 我猜这个变化是罪魁祸首。如果我们不添加给定标志,则 PDF 打开活动(或应用程序)没有读取文件内容(或 uri)的权限。这就是活动打开一秒钟然后关闭的原因,因为它无法读取文件。

    关于setFlags() 与addFlags(),因为setFlags() 删除了现有标志并添加了指定的标志,所以它不起作用。但addFlags() 保留现有标志并添加指定标志。因此addFlags() 起作用了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多