Отказ в разрешении: чтение com.android.providers.downloads.DownloadStorageProvider требует android.permission.MANAGE_DOCUMENTS - PullRequest
0 голосов
/ 02 июля 2018

Редактировать: Это не повторяющийся вопрос. Без вопросов, я видел ответы, как решить эту проблему, когда вы не можете контролировать действие, отправляющее намерение (в моем случае приложение для просмотра в браузере или, возможно, приложение для просмотра файлов отправляет намерение в мое приложение). А потом, более конкретно, это не касается фотографий / галереи.


Это уже давно мучает мое приложение. Лично я не могу заставить это случиться с любым устройством, но я вижу, что после сбоев это часто случается с другими.

Мое приложение получает намерение, содержащее 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()

У меня нет контроля над приложением / деятельностью, отправляющей намерение. Я подумал, что, немедленно взяв файл и сохранив его во временный каталог, я мог бы исправить это (как видно из других ответов) - но нет.

Я также добавил android.permission.MANAGE_DOCUMENTS, но, как и ожидалось (из других ответов), он не работает.

Кто-нибудь когда-нибудь сталкивался с этим? Похоже, что это влияет на устройства от Android 4 до 7, поэтому не относится только к одной версии ОС.

Ответы [ 3 ]

0 голосов
/ 06 июля 2018

Вам может потребоваться добавить следующие разрешения времени выполнения в ваш код, а также манифест

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

Вы можете обратиться по этой ссылке # save_zip_files

Надеюсь, это поможет !!

0 голосов
/ 06 июля 2018

Просто добавьте эту строку, прежде чем получите URI

StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
StrictMode.setVmPolicy(builder.build());
0 голосов
/ 06 июля 2018

Ну, я сталкивался с этой проблемой раньше, у меня было устройство OPPO, которое работает на Android 7.1, и оно работало нормально, кстати, это делает проблему на Samsung с той же версией Android, поэтому, чтобы решить эту проблему, я попросил хранилище для чтения разрешение при необходимости, и это работает.

Пример для людей, которые любят код:

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" />

И используйте разрешение на запись, чтобы записать файл тоже.

...