Получение разрешения на внешнее хранилище (плагин file_provider) - PullRequest
0 голосов
/ 28 мая 2018

У меня возникают некоторые проблемы с получением разрешений на внешнее хранилище на устройствах Android с флаттером.

Когда я пытаюсь создать каталог во внешнем хранилище, я получаю эту ошибку (я просто изменил каталогдля этого примера. В моем собственном проекте имя каталога другое):

I/flutter (12727): ══╡ EXCEPTION CAUGHT BY GESTURE ╞═══════════════════════════════════════════════════════════════════
I/flutter (12727): The following FileSystemException was thrown while handling a gesture:
I/flutter (12727): Creation failed, path = '/storage/emulated/0/com.domain.bundle' (OS Error: Permission denied,
I/flutter (12727): errno = 13)
I/flutter (12727): 

Я уже добавил
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
в файл манифеста и перестроил весь проект.Что еще можно попробовать?

Кроме того, просто перечисление всех файлов во внешнем хранилище дает такую ​​же ошибку разрешения.

Надеюсь услышать!

Ответы [ 3 ]

0 голосов
/ 28 мая 2018

Кроме того, необходимо добавить WRITE_EXTERNAL_STORAGE и READ_EXTERNAL_STORAGE к вашему android/app/src/main/AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.xxx.yyy">
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
...
</manifest>

Вам также необходимо Разрешение запроса времени выполнения , используя пакет simple_permissions :

import 'package:simple_permissions/simple_permissions.dart';

PermissionStatus permissionResult = await SimplePermissions.requestPermission(Permission. WriteExternalStorage);
if (permissionResult == PermissionStatus.authorized){
  // code of read or write file in external storage (SD card)
}

Примечание:

  1. когда Первый раз код запуска SimplePermissions.requestPermission , приложение откроет окно, вы ДОЛЖНЫ нажмите ALLOW:

, чтобы получить разрешение.

Если ранее вы нажали DENY, то можете через приложение удаления отладки затем повторно отладить, чтобы установить его, чтобы исправить это -> вызвать всплывающее окно и дать вам возможность нажать ALLOW.
0 голосов
/ 15 мая 2019

пожалуйста, используйте пакет package_handler для запроса разрешения.
https://pub.dev/packages/permission_handler
https://github.com/BaseflowIT/flutter-permission-handler

import 'package:permission_handler/permission_handler.dart';

...

void _showFilesinDir({Directory dir}) {
    dir.list(recursive: false, followLinks: false)
    .listen((FileSystemEntity entity) {
      print(entity.path);
    });
  }

...

onTap: () async{
            Map<PermissionGroup, PermissionStatus> permissions = await PermissionHandler().requestPermissions([PermissionGroup.storage]);

            var systemTempDir = Directory.systemTemp;
            _showFilesinDir(dir: systemTempDir);

            final myDir = new Directory('/sdcard');
            myDir.exists().then((isThere) {
              isThere ? _showFilesinDir(dir: myDir) : print('non-existent');
            });

          }
...

и результат эмулятора выглядит следующим образом:

I/flutter (19980): /data/user/0/xxx.login_challenge/code_cache/flutter_engine <br>
I/flutter (19980): /data/user/0/xxx.login_challenge/code_cache/login_challengeMSBLSX <br>
...
I/flutter (19980): /sdcard/Android <br>
0 голосов
/ 28 мая 2018

Для Android 6.0 и выше, если в приложении есть функции, для которых требуется разрешение Dangerous ( список опасных разрешений ), оно должно запросить разрешение (я) явно (смотрите изображения здесь)

Вы добавили разрешение в файл манифеста, этого недостаточно, вам также необходимо реализовать запросы времени выполнения для ваших разрешений.

Я проверил в репозитории Flutter, похожеони работают над плагином для этого.Вот их обсуждение .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...