Проблема разрешения Android WRITE_EXTERNAL_STORAGE для Samsung Galaxy Api 23 версии 6 - PullRequest
0 голосов
/ 28 января 2019

Мне нужно открыть PDF, используя URI.У меня есть код, чтобы открыть PDF.Мой код работает на Api больше 23. Я получаю следующее исключение SecurityException при попытке загрузить файл на устройство Samsung Galaxy с Api 23 и версией 6.

Вот исключение:

01-25 19:28:38.723 6655-6667/android.process.media E/DatabaseUtils: Writing exception to parcel
    java.lang.SecurityException: No permission to write to /storage/emulated/0/Download/Canto Quick Start Guide.pdf: Neither user 10022 nor current process has android.permission.WRITE_EXTERNAL_STORAGE.
        at android.app.ContextImpl.enforce(ContextImpl.java:1438)
        at android.app.ContextImpl.enforceCallingOrSelfPermission(ContextImpl.java:1470)
        at android.content.ContextWrapper.enforceCallingOrSelfPermission(ContextWrapper.java:675)
        at com.android.providers.downloads.DownloadProvider.checkFileUriDestination(DownloadProvider.java:724)
        at com.android.providers.downloads.DownloadProvider.insert(DownloadProvider.java:558)
        at android.content.ContentProvider$Transport.insert(ContentProvider.java:263)
        at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:163)
        at android.os.Binder.execTransact(Binder.java:507)

Я установил требуемое разрешение в файле манифеста

<uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.CALL_PHONE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

У меня есть следующая проверка, чтобы проверить, нет ли у пользователя разрешения WRITE_EXTERNAL_STORAGE, а затем попросить пользователя предоставить ему доступ.

int PERMISSION_REQUEST_WRITE_EXTERNAL_STORAGE = 2;
    //             Check whether this app has write external storage permission or not.
                int writeExternalStoragePermission = ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE);
                // If do not grant write external storage permission.
                if (writeExternalStoragePermission != PackageManager.PERMISSION_GRANTED) {
                    // Request user to grant write external storage permission.
                    ((MainActivity)activity).getSharedPreferenceManager().add(PreferenceConstants.SHAREPOINT_FILE_URI, getUrl((SharepointFile) object, activity));
                    ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, PermissionConstants.PERMISSION_REQUEST_WRITE_EXTERNAL_STORAGE);
                } else {
                    Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(getUrl((SharepointFile) object, activity)));
                    intent.setDataAndType(Uri.parse(getUrl((SharepointFile) object, activity)), "application/pdf");
                    activity.startActivity(intent);

                }

Я переопределяю onRequestPermissionResult в MainActivity.java, чтобы, как только пользователь предоставил разрешение, загрузка могла быть начата.

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);

    switch (requestCode) {
        case PermissionConstants.PERMISSION_REQUEST_WRITE_EXTERNAL_STORAGE:
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                String fileUri = getSharedPreferenceManager().get(PreferenceConstants.SHAREPOINT_FILE_URI);

                Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(fileUri));

                startActivity(intent);
            } else {
                getSharedPreferenceManager().remove(PreferenceConstants.SHAREPOINT_FILE_URI);
            }
            break;
    }
}

У меня есть код, чтобы спросить пользователядля разрешения.Я получаю диалог / предупреждение, чтобы разрешить доступ.Как только пользователь нажимает кнопку «Разрешить», я вижу, что она по-прежнему дает вышеуказанное исключение.Я зашел в настройки, чтобы проверить разрешение моего приложения и убедиться, что оно включено для хранения.Почему я все еще получаю разрешение?Любые указатели на то, что я мог бы упустить здесь?Ценю вашу помощь!

1 Ответ

0 голосов
/ 29 января 2019

Это только предположение, но я вижу, что вы объявили оба

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

Но документы говорит:

Любое приложение, которое объявляет разрешение WRITE_EXTERNAL_STORAGEнеявно предоставляется это (READ_EXTERNAL_STORAGE) разрешение.

Попробуйте удалить

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...