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

#flutter #flutter-dependencies #flutter-packages #flutter-image

#flutter #flutter-зависимости #flutter-пакеты #flutter-изображение

Вопрос:

Я пытаюсь сохранить изображение в локальном каталоге телефона. Здесь я использую пакет 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. Я очистил flutter и запустил код, но проблема осталась прежней.

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

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

Ответ №1:

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

Ответ №2:

В этом пакете всего 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}'),

  

Комментарии:

1. Спасибо за ответ. да, он загружает изображение таким образом, но оно хранится в » / storage/emulated/0 / Android/data/<applicationId>/files «. Но я хочу увидеть это загруженное изображение в телефонной галерее. Поэтому для этого я должен сохранить изображение в папке dowload или в любой другой указанной папке. Не могли бы вы дать мне решение для этого. Я был бы очень признателен, если бы вы могли помочь мне с этим @Akif