Не позволяет сохранять изображение в локальный каталог во флаттере в android 10

Я пытаюсь сохранить изображение в локальном каталоге телефона. Здесь я использую для этого пакет image_downloader. Вот мой код

class DownloadImage {

  Future writeToDownloadPath(GridImage imageData) async {

    try {

      var imageId = await ImageDownloader.downloadImage(imageData.url
      ,destination: AndroidDestinationType.custom(directory: 'motivational Quotes', 
      inPublicDir: true ,subDirectory: '/motivational Quotes${imageData.location}'));

      print('imageId' + imageId.toString());

      if (imageId == null) {
        return;
      }

    } catch(e) {
      print(e.toString());
    }
  }

}

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

E/MethodChannel#plugins.ko2ic.com/image_downloader(25282): java.lang.IllegalStateException: Not one of standard directories: motivational Quotes

Я уже добавил android: requestLegacyExternalStorage = true в AndroidManifest и установил targetSdkVersion и compileSdkVersion на 29 в файле build.gradle. Я промахнулся и запустил код, но проблема осталась прежней.

build.gradle

defaultConfig {

    applicationId "com.example.app
    minSdkVersion 21
    targetSdkVersion 29
    versionCode flutterVersionCode.toInteger()
    versionName flutterVersionName
    multiDexEnabled true
}

AndroidManifest

<application
      android:name="io.flutter.app.FlutterApplication"
      android:label="Motivational Quotes"
      android:icon="@mipmap/ic_launcher"
      android:requestLegacyExternalStorage="true">

Буду очень признателен, если кто-нибудь поможет мне с этим вопросом. Спасибо !


person sithum dilanga    schedule 14.10.2020    source источник


Ответы (2)


Я столкнулся с той же проблемой с Android 10, я думаю, что функция сохранения в пользовательском каталоге несовместима с Android10. Тот же код отлично работает для других

person Sneh Modi    schedule 05.11.2020

В этом пакете есть только 4 стандартных каталога.

  /// Environment.DIRECTORY_DOWNLOADS
  static final directoryDownloads =
      AndroidDestinationType._internal("DIRECTORY_DOWNLOADS");

  /// Environment.DIRECTORY_PICTURES
  static final directoryPictures =
      AndroidDestinationType._internal("DIRECTORY_PICTURES");

  /// Environment.DIRECTORY_DCIM
  static final directoryDCIM =
      AndroidDestinationType._internal("DIRECTORY_DCIM");

  /// Environment.DIRECTORY_MOVIES
  static final directoryMovies =
      AndroidDestinationType._internal("DIRECTORY_MOVIES");

Итак, вам нужно изменить здесь:


 var imageId = await ImageDownloader.downloadImage(imageData.url
      ,destination: AndroidDestinationType.custom(directory: 'motivational Quotes', 
      inPublicDir: true ,subDirectory: '/motivational Quotes${imageData.location}'));

Я советую вам сделать это просто вот так:


 destination: AndroidDestinationType.directoryPictures
                        ..inExternalFilesDir()
                        ..subDirectory('${imageData.location}'),

person Akif    schedule 14.10.2020
comment
Спасибо за ответы. да, он загружает изображение таким образом, но оно хранится в / storage / emulated / 0 / Android / data / ‹applicationId› / files`. Но я хочу увидеть это загруженное изображение в галерее телефона. Поэтому для этого мне нужно сохранить изображение в папке загрузки или любой другой указанной папке. Не могли бы вы дать мне решение для этого. Я был бы очень признателен, если бы вы помогли мне с этим @Akif - person sithum dilanga; 15.10.2020