是否可以重用内容sheme URI

时间:2016-11-07 11:01:35

标签: android android-fileprovider

从文件浏览器打开文件时,我得到一个内容方案URI,如下所示:

content://com.asus.filemanager.OpenFileProvider/file/sdcard/backups/apps/testfile.apk

然后我使用内容解析器使用以下内容制作文件的临时副本:

File tempFile = getFileFromContentUri(getContext(), mUri, null);

应用程序处理完tempFile后,该文件将被删除。现在问题是我想用以下代码将mUri转发到另一个活动,但是这样做时我得到了一个安全异常,所以看起来URI只能使用一次,这是对的吗?:

        private forwardFile(Uri fileUri) {
            final Intent installIntent = new Intent(Intent.ACTION_INSTALL_PACKAGE);
            Uri uri;
            if (ContentResolver.SCHEME_CONTENT.equals(fileUri.getScheme())) {
                uri = new Uri.Builder()
                        .path(fileUri.getPath())
                        .authority(fileUri.getAuthority())
                        .scheme(ContentResolver.SCHEME_CONTENT)
                        .build();
            }
            installIntent.setData(uri);
            installIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_GRANT_READ_URI_PERMISSION);
            context.startActivity(installIntent);
       }

是否有可能重复使用你能看到的uri或workaorund?我没有看到一种可以处理这种情况的方法,例如:我必须删除临时文件,但是如果我转发复制的文件而不是原始的URI,我就不会收到回调,因此我不知道何时删除复制的文件。

这是我得到的例外:

java.lang.SecurityException: Uid 10165 does not have permission to uri 0 @ content://com.asus.filemanager.OpenFileProvider/file/sdcard/backups/apps/testfile.apk

2 个答案:

答案 0 :(得分:0)

仅当服务应用程序定义持久权限且客户端调用context.getContentResolver()。takePersistableUriPermission()时,这可能有效,但我也不确定。

答案 1 :(得分:-1)

您获得了以下权限:

content://com.asus.filemanager.OpenFileProvider/file/sdcard/backups/apps/testfile.apk

难怪你有一个java.lang.SecurityException:使用完全不同的(并且不存在的)文件:

content://com.asus.filemanager.OpenFileProvider/file/sdcard/Download/testfile.apk