权限被拒绝:阅读 com.android.providers.downloads.DownloadStorageProvider 需要 android.permission.MANAGE_DOCUMENTS

Permission Denial: reading com.android.providers.downloads.DownloadStorageProvider requires android.permission.MANAGE_DOCUMENTS

编辑:这不是一个重复的问题。毫无疑问,当您无法控制 activity 发送意图时,我已经看到了如何解决这个问题的答案(在我的例子中,浏览器应用程序或文件浏览应用程序正在向我的应用程序发送意图).然后更具体地说,这不是在处理 photos/gallery.


这已经困扰我的一个应用程序一段时间了。我个人无法让它在任何设备上发生,但我可以从崩溃中看到它经常发生在其他人身上。

我的应用程序从外部应用程序收到包含 ZIP 文件的意图。我在 onCreate()onNewIntent():

中捕获它
Intent intent = getIntent();
if (intent != null && intent.getData() != null)
    beginZipIntent(intent);

beginZipIntent()中:

Uri data = intent.getData();
String filename = data.toString();

// Open input stream to copy ZIP to a temporary directory.
Uri uri = Uri.parse(filename);
InputStream inputStream = null;

try
{
    inputStream = getContentResolver().openInputStream(uri); // This fails
}
catch (Exception e)
{
    //...
}

上面一行,部分设备出现故障:

Permission Denial: reading com.android.providers.downloads.DownloadStorageProvider uri content://com.android.providers.downloads.documents/document/2772 from pid=26094, uid=10094 requires android.permission.MANAGE_DOCUMENTS, or grantUriPermission()

我无法控制 app/activity 发送意图。我想通过立即抓取文件并将其保存到一个临时目录我可以解决这个问题(如其他答案中所见) - 但没有。

我也添加了 android.permission.MANAGE_DOCUMENTS 但正如预期的那样(从其他答案中)它不起作用。

有人 运行 喜欢这个吗?似乎影响范围从 Android 4 到 7 的设备,因此不特定于一个 OS 版本。

好吧,我以前遇到过这个问题,我有一个 oppo 设备,运行 在 android 7.1 上运行良好,顺便说一句,它在三星上使用相同版本的 [=23] 时出现问题=],所以为了解决这个问题,我在需要时请求了读取存储权限,并且成功了。

热爱代码的人的例子:

public class CheckPermissions {

public static boolean hasPermission(int PERMISSION_REQUEST, String permission, Context context) {
    if (ContextCompat.checkSelfPermission(context,
            permission)
            != PackageManager.PERMISSION_GRANTED) {

        // Should we show an explanation?
        if (ActivityCompat.shouldShowRequestPermissionRationale((Activity) context,
                permission) &&
                ContextCompat.checkSelfPermission(context,
                        permission)
                        != PackageManager.PERMISSION_GRANTED) {

            return false;

        } else {

            ActivityCompat.requestPermissions((Activity) context,
                    new String[]{permission},
                    PERMISSION_REQUEST);

        }

        return false;
    } else {
        return true;


    }
    }
}

并检查权限:

if (CheckPermissions.hasPermission(REQUEST_CODE,
                    Manifest.permission.READ_EXTERNAL_STORAGE, this))
                    // todo read the saved URI

我还希望您将权限添加到清单中:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

并且也使用写入权限来写入文件。

您可能还需要在代码和清单中添加以下运行时权限

<uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

你可以参考这个link#save_zip_files

希望对您有所帮助!!

只需在获取 URI 之前添加这一行

StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
StrictMode.setVmPolicy(builder.build());