- Assets (Активы)
- Чтение файлов
- Используем собственные шрифты
- Загрузка локальных файлов из активов в WebView
- Получаем список файлов в папке assets
- Ограничение на размер файлов
- Работа с файловой системой
- Чтение и сохранение файлов
- Андроид, как я могу получить список всех файлов в папке?
- 6 ответов
- Как вывести список файлов в каталоге Android?
- Android, как я могу получить список всех файлов в папке?
Assets (Активы)
В Android имеется ещё один каталог, в котором могут храниться файлы, предназначенные для включения в пакет — assets. Этот каталог находится на том же уровне, что и res. Для файлов, располагающихся в assets, в R.java не генерируются идентификаторы ресурсов. Для их считывания необходимо указать путь к файлу. Путь к файлу является относительным и начинается с /assets. Этот каталог, в отличие от подкаталога res, позволяет задавать произвольную глубину подкаталогов и произвольные имена файлов и подкаталогов.
По умолчанию проект в студии не содержит данную папку. Чтобы её создать, выберите меню File | New | Folder | Assets Folder.
Чтение файлов
Для доступа к файлам используется класс AssetManager. Пример для чтения текстового файла.
Сначала на Kotlin.
Для доступа к графическому файлу из актива можно использовать следующий код:
Вы также можете загрузить изображение в Bitmap, используя BitmapFactory.decodeStream(), вместо Drawable.
Функция-расширение для Kotlin, которая вернёт Bitmap.
Используем собственные шрифты
Напишем практический пример создания приложения, в котором будут использоваться собственные шрифты, не входящие в стандартную библиотеку шрифтов Android. Для этого мы упакуем нужные шрифты вместе с приложением. Поместим в каталог assets/fonts файлы шрифтов (можно скачать бесплатные шрифты с сайтов 1001 Free Fonts или Urban Fonts ).
В файл разметки добавим пару текстовых полей с заготовленным текстом для вывода этого текста с нашим шрифтом.
В классе активности загрузим объект EditText из ресурсов, а затем создадим объект Typeface, используя вызов статического метода Typeface.createFromAsset(). Метод createFromAsset() принимает два параметра:
- объект AssetManager, который можно получить вызовом метода getAssets()
- путь к файлу актива.
Например, загрузить шрифт для текстового поля EditText можно следующим способом:
Запустив проект, мы увидим в текстовых полях надписи Happy New Year! и Meow!, выводимые нашими собственными шрифтами.
Пример для фрагмента.
Загрузка локальных файлов из активов в WebView
Если нужно загрузить локальные страницы и изображения из активов в WebView, то можно использовать префикс file://android_asset. Подробнее смотрите в статье про WebView.
Получаем список файлов в папке assets
Можно получить список файлов, которые находятся в папке assets. Для быстрой проверки кода я вручную скопировал в папку два файла:
Кроме ваших файлов, также возвращаются странные папки /images, /sounds, /webkit. Учитывайте это в своих проектах. Так как в папке можно создавать собственные подпапки, то можно воспользоваться вспомогательным методом:
Ограничение на размер файлов
По сети гуляет информация, что существует ограничение в 1 Мб на размер файлов в папке assets. При превышении размера у вас может появиться ошибка:
Я не сталкивался, поэтому рецепт решения проблемы не предлагаю.
Источник
Работа с файловой системой
Чтение и сохранение файлов
Работа с настройками уровня activity и приложения позволяет сохранить небольшие данные отдельных типов (string, int), но для работы с большими массивами данных, такими как графически файлы, файлы мультимедиа и т.д., нам придется обращаться к файловой системе.
ОС Android построена на основе Linux. Этот факт находит свое отражение в работе с файлами. Так, в путях к файлам в качестве разграничителя в Linux использует слеш «/», а не обратный слеш «\» (как в Windows). А все названия файлов и каталогов являются регистрозависимыми, то есть «data» это не то же самое, что и «Data».
Приложение Android сохраняет свои данные в каталоге /data/data/ / и, как правило, относительно этого каталога будет идти работа.
Для работы с файлами абстрактный класс android.content.Context определяет ряд методов:
boolean deleteFile (String name) : удаляет определенный файл
String[] fileList () : получает все файлы, которые содержатся в подкаталоге /files в каталоге приложения
File getCacheDir() : получает ссылку на подкаталог cache в каталоге приложения
File getDir(String dirName, int mode) : получает ссылку на подкаталог в каталоге приложения, если такого подкаталога нет, то он создается
File getExternalCacheDir() : получает ссылку на папку /cache внешней файловой системы устройства
File getExternalFilesDir(String type) : получает ссылку на каталог /files внешней файловой системы устройства
File getFileStreamPath(String filename) : возвращает абсолютный путь к файлу в файловой системе
FileInputStream openFileInput(String filename) : открывает файл для чтения
FileOutputStream openFileOutput (String name, int mode) : открывает файл для записи
Все файлы, которые создаются и редактируются в приложении, как правило, хранятся в подкаталоге /files в каталоге приложения.
Для непосредственного чтения и записи файлов применяются также стандартные классы Java из пакета java.io.
Итак, применим функционал чтения-записи файлов в приложении. Пусть у нас будет следующая примитивная разметка layout:
Поле EditText предназначено для ввода текста, а TextView — для вывода ранее сохраненного текста. Для сохранения и восстановления текста добавлены две кнопки.
Теперь в коде Activity пропишем обработчики кнопок с сохранением и чтением файла:
При нажатии на кнопку сохранения будет создаваться поток вывода FileOutputStream fos = openFileOutput(FILE_NAME, MODE_PRIVATE)
В данном случае введенный текст будет сохраняться в файл «content.txt». При этом будет использоваться режим MODE_PRIVATE
Система позволяет создавать файлы с двумя разными режимами:
MODE_PRIVATE : файлы могут быть доступны только владельцу приложения (режим по умолчанию)
MODE_APPEND : данные могут быть добавлены в конец файла
Поэтому в данном случае если файл «content.txt» уже существует, то он будет перезаписан. Если же нам надо было дописать файл, тогда надо было бы использовать режим MODE_APPEND:
Для чтения файла применяется поток ввода FileInputStream :
Подробнее про использование потоков ввода-вывода можно прочитать в руководстве по Java: https://metanit.com/java/tutorial/6.3.php
В итоге после нажатия кнопки сохранения весь текст будет сохранен в файле /data/data/название_пакета/files/content.txt
Где физически находится созданный файл? Чтобы увидеть его на подключенном устройстве перейдем в Android Stud в меню к пункту View -> Tool Windows -> Device File Explorer
После этого откроектся окно Device File Explorer для просмотра файловой системы устройства. И в папке data/data/[название_пакета_приложения]/files мы сможем найти сохраненный файл.
Источник
Андроид, как я могу получить список всех файлов в папке?
мне нужно имя (строка) всех файлов в res/raw/
похоже, что корневой каталог является корнем эмулятора android. и не корневой каталог моих компьютеров. Это имеет достаточно смысла, но на самом деле не помогает мне узнать, где существует папка raw.
Update: Спасибо за все отличные ответы. Похоже, что некоторые из них работают,но только наполовину. Возможно, более подробное описание будет помощи
Я хочу получить все mp3-файлы в папке raw, чтобы я мог получить все имена, а затем добавить их в URI для воспроизведения случайного MP3 следующим образом.
когда я поставил » Деннис.mp3 » в папку assets, он появляется, как и ожидалось, однако, используя приведенный выше код, я больше не могу получить доступ к этому MP3, если нет чего-то вроде:
6 ответов
чтобы перечислить все имена ваших необработанных активов, которые в основном являются именами файлов с удаленными расширениями, вы можете сделать следующее:
поскольку фактические файлы не просто сидят в файловой системе, как только они находятся на телефоне, имя не имеет значения, и вам нужно будет ссылаться на них целым числом, назначенным этому имени ресурса. В приведенном выше примере вы можете получить это целое число таким образом:
Это тот же int, который вы получите, обратившись к Р. сырыми.whateveryounamedtheresource
этот код будет извлекать все файлы из «Нового Foder» sdCard.
а также убедитесь, что добавить Android sd карты разрешение на запись в манифесте.xml-файл
мне нужно имя (строка) всех файлов в res/raw/
нет файлов в res/raw/ на устройстве. Это ресурсы. Нет хорошего способа перебирать ресурсы, кроме как с помощью отражения перебирать статические члены данных R.raw класс для получения различных имен и значений идентификаторов.
но на самом деле не помогает мне узнать, где существует папка raw.
как папка, она существует только на ваша машина разработки. Это не папка на устройстве.
насколько я помню, у вас будет список с (просто попробуйте разные пути):
Источник
Как вывести список файлов в каталоге Android?
Тем не менее, хотя у меня есть файлы в этом каталоге, он возвращает мне list.length = 0 . какие-нибудь идеи?
Чтобы получить доступ к файлам, разрешения должны быть указаны в файле манифеста.
Я только что обнаружил, что:
new File(«/sdcard/»).listFiles() возвращает null, если у вас нет:
установить в вашем файле AndroidManifest.xml.
Ну, AssetManager списки файлов в assets папке, которая находится внутри вашего файла APK. Итак, в приведенном выше примере вы пытаетесь указать [apk] / assets / sdcard / Pictures.
Если вы поместите несколько изображений в assets папку внутри вашего приложения, и они будут в Pictures каталоге, вы сделаете mgr.list(«/Pictures/») .
С другой стороны, если у вас есть файлы на SD-карте, которые находятся за пределами вашего файла APK, в Pictures папке, вы должны использовать File так:
И соответствующие ссылки из документов:
File
Asset Manager
В дополнение ко всем приведенным выше ответам:
Если вы используете Android 6.0+ (уровень API 23+), вы должны явно запросить разрешение на доступ к внешнему хранилищу. Просто имея
в вашем манифесте будет недостаточно. Вы также активно запрашивали разрешение в своей деятельности:
Ваш path не находится в папке с ресурсами. Вы либо перечисляете файлы в папке с активами с помощью, AssetManager.list() либо перечисляете файлы на SD-карте с помощью File.list()
Могут произойти две вещи:
- Вы не добавляете READ_EXTERNAL_STORAGE разрешение на AndroidManifest.xml
- Вы ориентируетесь на Android 23 и не запрашиваете у пользователя это разрешение. Перейдите на Android 22 или спросите у пользователя разрешение.
Если вы используете Android 10 / Q и сделали все правильно, чтобы запросить разрешения на доступ для чтения внешнего хранилища, но оно по-прежнему не работает, стоит прочитать этот ответ:
У меня был рабочий код, но мое устройство взяло на себя обновление, когда оно было подключено к сети (обычно оно было без подключения). В Android 10 доступ к файлам больше не работал. Единственный простой способ исправить это, не переписывая код, — это добавить этот дополнительный атрибут в манифест, как описано. Доступ к файлам теперь снова работает как в Android 9. YMMV, вероятно, он не будет работать в будущих версиях.
Источник
Android, как я могу получить список всех файлов в папке?
Мне нужно имя (String) всех файлов в res / raw /
Похоже, что корневой каталог является корнем эмулятора android … а не корневым каталогом моих компьютеров. Это имеет смысл, но на самом деле не помогает мне узнать, где находится исходная папка.
Обновление: Спасибо за все замечательные ответы. Похоже, что некоторые из них работают, но только получают меня на полпути. Возможно, более подробное описание поможет …
Я хочу получить все mp3-файлы в исходной папке, чтобы я мог получить все имена, а затем добавить их в URI, чтобы воспроизвести случайный MP3 следующим образом …
Когда я помещаю «dennis.mp3» в папку с ресурсами, он отображается как ожидалось … однако, используя вышеприведенный код, я больше не могу получить доступ к этому MP3 … если не существует чего-то вроде строки:
Еще раз спасибо за полезные ответы.
Чтобы перечислить все имена ваших исходных активов, которые в основном являются именами файлов с отключенными расширениями, вы можете сделать это:
Поскольку фактические файлы не просто сидят в файловой системе, как только они находятся на телефоне, имя не имеет значения, и вам нужно будет обратиться к ним целым числом, назначенным этому имени ресурса. В приведенном выше примере вы можете получить это целое число:
Это тот же int, который вы получите, обратившись к R.raw.whateveryounamedtheresource
Этот код будет извлекать все файлы из «New Foder» sdCard.
А также обязательно добавьте разрешение на запись в android sd card в файл manifest.xml
Мне нужно имя (String) всех файлов в res / raw /
Нет файлов в res/raw/ на устройстве. Это ресурсы. Нет никакого хорошего способа перебора ресурсов, кроме как с помощью отражения для итерации по статическим членам R.raw класса R.raw чтобы получить различные идентификационные имена и значения.
Но на самом деле не помогает мне узнать, где находится необработанная папка.
Как папка, она существует только на вашей машине разработки. Это не папка на устройстве.
Вы можете использовать AssetManager :
Насколько я помню, у вас будет список (просто попробуйте разные пути):
Посмотрите http://developer.android.com/reference/android/content/res/Resources.html. Обычно вы можете получить экземпляр ресурсов, связанный с вашим приложением, с помощью функции getResources ().
Класс ресурсов предоставляет доступ к http://developer.android.com/reference/android/content/res/AssetManager.html (см. Метод getAssets ()). И, наконец, получите доступ к вашим упакованным файлам (apk) с помощью метода AssetManager.list (). Наслаждайтесь!
Из Context вы можете вызвать что-то вроде этого:
Источник