重新启动应用程序后保持URI权限

时间:2020-05-19 10:34:10

标签: android android-contentprovider

编辑1::固定快捷方式是指主屏幕上的快捷方式,就像任何应用程序的启动器图标一样。例如:

我有一个可将PDF快捷方式固定到主屏幕的应用程序。当前,用户面临的问题是,重新启动设备后,固定文件无法打开。我检查发现,重新启动操作系统后,URI权限被吊销。因此,我用Google搜索并找到了几则SO帖子。但是问题没有得到解决。

这是我的代码:

            val file = File(path)
            val pdfIntent = Intent(Intent.ACTION_VIEW)

            val uri = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                FileProvider.getUriForFile(this,
                        applicationContext.packageName + ".provider", file)
            } else {
                Uri.fromFile(file)
            }

 pdfIntent.setDataAndType(uri, "application/pdf")
            pdfIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
            pdfIntent.addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION);


// Providing all PDF Readers access to the Uri.
            val resInfoList = packageManager.queryIntentActivities(pdfIntent, PackageManager.MATCH_DEFAULT_ONLY)
            for (resolveInfo in resInfoList) {
                val packageName: String = resolveInfo.activityInfo.packageName
                Log.d("Package", packageName)
                grantUriPermission(packageName, uri, Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION)
            }
            grantUriPermission(packageName, uri, Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION)

...

...

          shortcutManager.requestPinShortcut(shortcut, null)

当我重新启动设备并打开快捷方式(在Android默认的PDF Viewer中打开)时,在调试时会收到以下日志:

com.google.android.apps.docs E/ContentUriOpener: content:com.parassidhu.pdfpin.provider: java.lang.SecurityException: Permission Denial: opening provider androidx.core.content.FileProvider from ProcessRecord{97a06 5716:com.google.android.apps.docs/u0a129} (pid=5716, uid=10129) that is not exported from UID 10138

通过查看其他SO帖子,我尝试实现上述的grantUriPermission(),但没有任何好处。我也尝试过contentResolver.takePersistableUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION),但没有用,但我怀疑我实施不正确。

根据报告,此问题发生在Oreo +(包括oreo)上。我在Android 9模拟器上进行了测试。在用户尚未重新启动应用程序之前,这段代码可以正常工作。

0 个答案:

没有答案