#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. Да, это правда. Но сейчас я думаю, что это может быть лучшим выбором.