Flutter: Создать каталог по внешнему пути хранения - путь к провайдеру getExternalStorageDirectory () - PullRequest
0 голосов
/ 26 января 2019

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

var dir = await getExternalStorageDirectory();
  if(!Directory("${dir.path}/myapp").existsSync()){
    Directory("${dir.path}/myapp").createSync(recursive: true);
  }

Это дает мне следующую ошибку

FileSystemException: Creation failed, path = '/storage/emulated/0/myapp' (OS Error: Permission denied, errno = 13)

Я установил разрешения в файле манифеста и использую следующий код для разрешений во время выполнения

List<Permissions> permissions = await Permission.getPermissionStatus([PermissionName.Storage]);
permissions.forEach((p) async {
  if(p.permissionStatus != PermissionStatus.allow){
    final res = await Permission.requestSinglePermission(PermissionName.Storage);
    print(res);
  }
});

Я проверил в настройках, что приложение получило разрешение, также как и предлагалось на некоторых ответах здесь, я также попытался дать разрешение из приложения настроек вручную, которое не работало

1 Ответ

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

Приведенный ниже код работает нормально в моем приложении, чтобы загрузить изображение с помощью URL-адреса во внешнее хранилище

Future<bool> downloadImage(String url) async {
  await new Future.delayed(new Duration(seconds: 1));
  bool checkResult =
      await SimplePermissions.checkPermission(Permission.WriteExternalStorage);
  if (!checkResult) {
    var status = await SimplePermissions.requestPermission(
        Permission.WriteExternalStorage);
    if (status == PermissionStatus.authorized) {
      var res = await saveImage(url);
      return res != null;
    }
  } else {
    var res = await saveImage(url);
    return res != null;
  }
  return false;
}

Future<Io.File> saveImage(String url) async {
  try {
    final file = await getImageFromNetwork(url);
    var dir = await getExternalStorageDirectory();
    var testdir =
        await new Io.Directory('${dir.path}/iLearn').create(recursive: true);
    IM.Image image = IM.decodeImage(file.readAsBytesSync());
    return new Io.File(
        '${testdir.path}/${DateTime.now().toUtc().toIso8601String()}.png')
      ..writeAsBytesSync(IM.encodePng(image));
  } catch (e) {
    print(e);
    return null;
  }
}

  Future<Io.File> getImageFromNetwork(String url) async {
  var cacheManager = await CacheManager.getInstance();
  Io.File file = await cacheManager.getFile(url);
  return file;
}

Namespaces

import 'dart:io' as Io;
import 'package:image/image.dart' as IM;
import 'package:flutter_cache_manager/flutter_cache_manager.dart';
import 'package:path_provider/path_provider.dart';
import 'package:simple_permissions/simple_permissions.dart';

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

...