#flutter
Вопрос:
Функция getExternalStorageDirectory() и ApplicationDocumentDirectory() предоставляет мне тот же каталог, который находится внутри папки Android. Мне нравится создавать папку в хранилище/эмулируемом/0 , я попытался явно создать ее с помощью каталога («хранилище/эмулируемое/0»). создайте(); затем он говорит, что у вас нет разрешения. И я дал все возможные разрешения и все равно получаю тот же результат. Есть ли способ создать папку в хранилище/эмулируется/0 ?
ПРИМЕЧАНИЕ: _getPermission возвращает bool в соответствии со статусом разрешения. Этот код хорошо работает в эмуляторе, но он не работает на реальном устройстве.
takePhoto(BuildContext context) async {
if ( await _getPermission(Permission.manageExternalStorage)){
final image =await picker.pickImage(source: ImageSource.camera);
var newPath = "storage/emulated/0/takephotosaver";
var directory = Directory(newPath).create();
File fileIMage = File(image!.path);
var imageName = DateTime.now().toString();
fileIMage.copy("$newPath/$imageName.jpg");
Navigator.push(context, MaterialPageRoute(builder: (context)=>MyPreview(fileIMage)));
}
}
}
Изменить :- Этот код работает в Android версии 9 и ниже, но не работает в Android 10 и 11. Есть ли способ отобразить изображение, сделанное моей камерой, в отдельной папке?
Ответ №1:
Все изменилось после Android 10. Вам не следует создавать папки storage/emulated/0
сейчас. Google строго относится к этому, и ваше приложение может быть отклонено, если вы опубликуете его в Google PlayStore. Если вы все еще хотите это сделать, добавьте это разрешение в свой AndroidManifest.xml
.
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
И чтобы получить разрешение от пользователя, сделайте это,
if (await Permission.manageExternalStorage.request().isGranted) {...}
Редактировать:
Всякий раз, когда вы создаете новый файл, устройство не может автоматически найти его. Вам придется вручную указать устройству, чтобы оно обновило файлы. Раньше вам приходилось обновлять все файлы на устройстве, чтобы оно обновлялось, что было очень неэффективно, но теперь вы можете просто отправить путь к файлу, который вы хотите обновить. Для этого вы можете использовать плагин media_scanner.
Или, если вы хотите сделать это самостоятельно с котлином, то вот код,
private fun broadcastFileUpdate(path: String){
context.sendBroadcast(Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,Uri.fromFile(File(path))))
}
Комментарии:
1. Тогда где я могу создать папку ? Только в корневой папке Android?
2. Вам разрешено создавать папки в
applicationFileDirectory
иexternalStorageDirectory
. Хотя вы можете хранить файлы в каталогах музыки, документов, загрузок без каких-либо дополнительных разрешений.3. На самом деле этот getexternaldirectory не дает мне каталог, который находится за пределами папки Android
4.
getApplicationFileDirectory
возвращает что-то вроде «/данные/данные/имя_пакета», доступ к которому возможен только с правами root.getExternalStorageDirectory
возвращает что-то вроде «/хранилище/эмулированное/Android/данные/имя_пакета» и может быть доступно любому пользователю, перейдя в папку Android. Я предполагаю, что вы думаете, что, поскольку он называется «внешнее хранилище», он вернет местоположение за пределами папки Android, но нет, папка в каталоге Android является внешним каталогом (не находится в корневом каталоге).5. Я запросил разрешение manageExternalStorage и добавил разрешение в манифест Android, но в нем говорится: «В манифесте не найдено разрешений для: [] 22». Что делать?