Создание нового текстового файла с возможностью совместного использования с помощью Flutter в Android 10 и выше

#flutter #android-10.0 #android-11 #scoped-storage

#flutter #android-10.0 #android-11 #область действия-хранилище

Вопрос:

Начиная с API 29 (Android 10), было введено хранилище с ограниченной областью действия. Ранее я мог напрямую создавать общий файл и записывать в него, используя это в Flutter:

 File f = File("/storage/emulated/0/MyApp/myFile.txt");
await f.writeAsString(contents);
  

Но с изменениями конфиденциальности теперь кажется невозможным сделать то же самое в Android 10 даже после того, как я дам разрешение на хранение.

Согласно документации,

Переместите все общие мультимедийные файлы в выделенный для приложений подкаталог каталога Downloads /.

Мои вопросы:

  • Могу ли я по-прежнему создавать файл /storage/emulated/0/MyApp/myFile.txt , если да, то как?
  • Если нет, то могу ли я создать файл /storage/emulated/0/Download/MyApp/myFile.txt непосредственно из Flutter без кода платформы?
  • Если мне нужно использовать код, зависящий от платформы, является ли использование средства выбора файлов единственным вариантом для текстового файла?

Также я не хочу использовать android:requestLegacyExternalStorage="true" , потому что тогда мое приложение не будет работать на Android 11.

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

1. В прошлый раз этот вопрос был закрыт из-за тега Android без правильного ответа. Поэтому я спрашиваю об этом еще раз, специально упоминая Flutter, чтобы избежать путаницы.

2. Просто подумал, что я бы добавил это сюда, если это для flutter, и вы хотите легко поделиться файлом, тогда взгляните на этот плагин, который сделает большую часть тяжелой работы за вас. Это работает как для iOS, так и для Android: pub.dev/packages/flutter_share

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

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

Ответ №1:

К сожалению, похоже, что это еще не было реализовано во Flutter, чтобы учесть новые изменения в области хранения. На GitHub есть открытая проблема: https://github.com/flutter/flutter/issues/35783

Ответ №2:

Правильным решением будет использовать android:requestLegacyExternalStorage="true" . О той части, которая не будет работать на Android 11. Я думаю, это не тот случай. Просто добавьте android:requestLegacyExternalStorage="true" в свой AndroidManifest файл и build.gradle измените targetSdkVersion 29 , сохраняя compileSdkVersion 30 при этом. Это должно работать нормально.

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

1. Ну, да, это будет работать, но это всего лишь обходной путь. Нам нужно перейти на Android 11 сейчас, 12 скоро выйдет.

2. Да, это правда. Но сейчас я думаю, что это может быть лучшим выбором.