Android内容提供导致SecurityException: Permission Denial,如果不立即使用.&l



在我的Android Manifest中,我注册了我的Activity,以便能够"打开";特定的文件。这一切都很好。当我接收到新的Intent并通过

从Intent中读取文件数据时
BufferedReader(InputStreamReader(contentResolver.openInputStream(intent.data)))

可以正常工作。但是,为了获得更好的视图流,我希望存储意图的URI并将其显示在另一个视图中(询问用户如何继续处理文件)。我存储这个意图。

然而,一旦视图打开,我基本上调用相同的东西
val br = BufferedReader(InputStreamReader(act.contentResolver.openInputStream(fileUri)))

但是这里我得到了一个异常

java.lang.SecurityException: Permission Denial: reading [FileBrowserApp I used for "opening the file"] uri content://... from pid=5242, uid=10159 requires the provider be exported, or grantUriPermission()

感觉就像URI过期了之类的?事实真的是这样吗?当我收到Intent时,我必须直接读取文件吗?我希望有一种方法可以保留URI,直到我想要读取文件。

我发现了这个问题。事实证明,这不是意图过期之类的问题。而是我自己的"处理"。修改路径

我所做的是将传入的Intent数据作为Uri。后来,我再次从该Uri获取提供程序路径。然而,这会导致查询的转换(而不是首先将其保留为字符串)破坏路径。

简而言之:问题在于URL的编码/解码。

原始意图路径(通过totalcommander打开-因此使用com)。Ghisler路径)看起来像这样:

content://com.ghisler.files/tree/primary%3A/document/primary%3Astorage%2Femulated%2F0%2Fbackup.bak

然而,从Uri中获得路径,冒号被解码,留下这样的输出路径:

content://com.ghisler.files/tree/primary:/document/primary:storage/emulated/0/backup.bak

您可以清楚地看到不同的编码。结果文件路径在再次从Uri中获取后就不一样了。这会导致异常——而不是意图无效。

相关内容

最新更新