Android SecurityException:拒绝从下载中读取文件的权限

Android SecurityException:拒绝从下载中读取文件的权限,android,android-4.4-kitkat,Android,Android 4.4 Kitkat,关于StackOverflow也有一些类似的问题,但发生的情况略有不同 我需要读取用户使用标准共享机制共享的服务中的文件。 从gallery或文件管理器或Google Drive共享的文件中读取文件没有问题。但是,当我尝试共享下载的文件时,会出现问题 我收到: java.lang.SecurityException:权限拒绝:打开提供程序 com.android.providers.DownloadStorageProvider从 ProcessRecord{432abf50 8550:clip

关于StackOverflow也有一些类似的问题,但发生的情况略有不同

我需要读取用户使用标准共享机制共享的服务中的文件。 从gallery或文件管理器或Google Drive共享的文件中读取文件没有问题。但是,当我尝试共享下载的文件时,会出现问题

我收到:

java.lang.SecurityException:权限拒绝:打开提供程序 com.android.providers.DownloadStorageProvider从 ProcessRecord{432abf50 8550:clipboard.clipboardtest/u0a167}pid=8550, uid=10167需要android.permission.MANAGE\u文档或 android.permission.MANAGE_文档

我的舱单:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="virtualclipboard.copytodesktop"
    android:installLocation="internalOnly">

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.MANAGE_DOCUMENTS" />
    <uses-permission android:name="android.permission.ACCESS_DOWNLOAD_MANAGER" />
    <uses-permission android:name="android.permission.ACCESS_ALL_DOWNLOADS" />
    <uses-permission android:name="android.permission.ACCESS_DOWNLOAD_MANAGER_ADVANCED" />

    <application>
        ...
    </application>

</manifest>

在Nexus 5、4.4.4、KitKat上复制。

我在共享操作时收到了有意的Uri-来自什么?下载应用程序?还有别的吗?您可以从清单中删除MANAGE_DOCUMENTS权限,因为这是一个签名级别的权限,除非您的应用程序是固件构建的一部分,否则您无法持有该权限。此外,将整个文件读入内存(尤其是使用该方法)只会成功读入小文件,因为您没有那么多堆空间。我鼓励您找到一种解决方案,它不涉及将整个文件读入内存。是的,我说的是下载应用程序。是的,我可以一部分一部分地阅读文件,不需要占用太多内存,但我至少需要能够打开它进行阅读。好吧,K-9 Mail使用我在运行Android 5.0的Nexus 4下载应用程序中共享的PDF文件没有问题。您是否验证了fileUri的外观?此外,您还可以取消所有与下载相关的权限,因为它们都是签名或签名系统,您无法持有。Uri看起来正常,因为它与其他应用程序共享,例如-content://com.android.providers.downloads.documents/document/1081. 我已经删除了你说的权限,但没有任何帮助。另外,有些应用程序并非都能共享下载应用程序中的文件,所以我做错了。顺便说一句,我可以共享下载应用程序中的.txt文件,但不能共享其他类型的文件。@nicolausYes您有过解决方案吗?
InputStream input = getContentResolver().openInputStream(fileUri);
byte[] fileData = Converter.InputStreamToByteArray(input);

// ...

public class Converter {
    public static byte[] InputStreamToByteArray(InputStream inputStream) {
        try {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            int reads = inputStream.read();
            while(reads != -1){
                baos.write(reads);
                reads = inputStream.read();
            }
            return baos.toByteArray();
        }
        catch (Exception e) {
            return null;
        }
    }
}