- Assets (Активы)
- Чтение файлов
- Используем собственные шрифты
- Загрузка локальных файлов из активов в WebView
- Получаем список файлов в папке assets
- Ограничение на размер файлов
- 41 Post
- Android: Loading files from the Assets and Raw folders
- Downloads
- Помещаем файлы из Assets на SD-карту с помощью Infles
- Описание:
- А теперь о создании и коде.
- Сложности
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. При превышении размера у вас может появиться ошибка:
Я не сталкивался, поэтому рецепт решения проблемы не предлагаю.
Источник
41 Post
Game Programming, Android and Retro Games
Android: Loading files from the Assets and Raw folders
Posted by Dimitri | May 24th, 2011 | Filed under Programming
This tutorial will explain how to load files from the res/raw and the Assets folder using a String to specify the file name. Yes, there are a lot of tutorials on this subject, but they all use the automatically generated integer IDs from the R class as inputs and not many of them even mention the possibility of loading files from the Assets folder. As a result of depending on the ID, the file reference must be known beforehand.
Instead, the code featured in this post will explain how to find the reference to the file and then load it at runtime based solely on its name. This means that the reference ID and the file don’t even have to exist in the first place, and can be acquired at run time.
Before looking into the code, it’s important to highlight the main differences between the raw folder and the Assets folder. Since raw is a subfolder of Resources (res), Android will automatically generate an ID for any file located inside it. This ID is then stored an the R class that will act as a reference to a file, meaning it can be easily accessed from other Android classes and methods and even in Android XML files. Using the automatically generated ID is the fastest way to have access to a file in Android.
The Assets folder is an “appendix” directory. The R class does not generate IDs for the files placed there, so its less compatible with some Android classes and methods. Also, it’s much slower to access a file inside it, since you will need to get a handle to it based on a String. There is also a 1MB size limit for files placed inside the Assets folder, however some operations are more easily done by placing files in this folder, like copying a database file to the system’s memory. There’s no (easy) way to create an Android XML reference to files inside the Assets folder.
The first thing the code does is to create two private variables. A Resources object that will act as a handle to the app’s resources and a String, that will be used to output the content of the files to LogCat (lines 16 and 18).
Now let’s jump straight to line 60 where the LoadFile() method is defined. It returns a String and takes two parameters: the first one is the file name and the second is a boolean, that signals the method whether it should load from the res/raw or the Assets folder.
After that, the method creates a InputStream object (line 63). Streams are like handles to read files into buffers (Input Stream) and to write files from these buffers (Output stream).
Line 65 checks if the loadFromRawFolder parameter is true. Case it is, the code at lines 68 and 70 is executed. The former dynamically loads resources from the raw folder. The getIdentifier() method from the resources object returns a resource ID based on the path. This parameter is composed by:
package name:type of resource/file name
Package name is self explanatory; type of resource can be one of the following: raw, drawable, string. File name, in this example, is the fileName parameter, an it’s being concatenated to create one single String. Since all information that this method requires is being passed on the first parameter the other two can be null.
Finally, line 70 feeds this ID to the openRawResource() method, which will return a InputStream from a file located at the res/raw folder.
At the else block, the Assets folder is being opened, by first calling the getAssets() method to return a handle to the Assets folder and right after that, the open() method is called, passing the fileName as the parameter. All that is done to also return the InputStream, although this time, for a file at the Assets folder (line 75).
Now that we have the InputStream, we can create the buffer to read the file into. That’s accomplished by line 79, that creates a byte array that has exactly the same length as iS (the InputStream object). The file is read into the buffer at the next line (line 81).
With the file loaded into the buffer, it’s time to prepare a OutputStream to write the buffer contents into. First, a object of this type is created at line 83. Then, the write() method is called passing the buffer as the parameter (line 85). With that, a handle to the file’s content was created.
There’s nothing left to do with these two streams, so they are closed at lines 87 and 88. Finally, the return for this method is set, by converting the oS object to a String (line 91).
At last, the LoadFile() method is called at line 33 (don’t forget to omit the file extension) and at line 47 (don’t forget to include the file extension). Both method calls are surrounded by a try/catch block since they can throw an exception.
The returned String from the method calls are stored at the output variable. It’s then later used to print the contents of the loaded files into LogCat’s console (lines 35 and 49).
And that’s about it! The method that was declared in the Activity can be easily adapted to load and return anything from these folders, not just a String. Additionally, it can be used to dynamically to acquire a reference, and load files at run time.
Downloads
Want to see more posts like this more often? Please donate by clicking at the button below:
Don’t feel like donating? Alternatively, you can support the site by purchasing the FULL version of the Arrows Live Wallpaper app at the Google Play Store™:
Источник
Помещаем файлы из Assets на SD-карту с помощью Infles
Доброго времени суток, Хабравчане!
Описание:
Почти все пользователи ОС Android знают практику приложений использовать файлы с SD карты.
Большинство приложений скачивают с интернета эти файлы и помещают их в свою папку, но не у всех пользователей есть возможность скачивать их из сети и не у всех разработчиков содержать свой сервер, а вручную копировать файлы, согласитесь, неудобно.
Поэтому что бы упростить всем жизнь и была написана программа «Infles», она распространяется бесплатно с открытым исходным кодом и по лицензии MIT. Программа позволяет в 1 клик установить необходимые файлы в указанную в настройках папку на SD карте. Для этого необходимо поместить их в папку «assets», в коде в файле «\Infles\src\ru\boomik\infles\InflesActivity.java» в переменной «COPY_DIR» указать путь на карте памяти и скомпилировать программу.
Идея программы появилась как раз при использовании приложения, для доступа ко всем возможностям которого необходимо было скопировать файлы на флэшку в определенную папку, а встроенного механизма небыло.
А теперь о создании и коде.
Приложение получилось простым, да и это его цель — простота и удобство использования. Состоит всего из 2-х классов, активити и сервис (для большей стабильности). Сервис ничего толкового не имеет, а вот активити разберем, в нем как раз и содержатся все функции (в конце статьи предоставлю ссылки на исходный код и пример приложения).
Layout (слой) приложения содержит 4 кнопки — одна большая, почти на весь экран и 3 дополнительных (которые можно скрыть изменив значение SHOW_BUTTON на false).
Активити содержит ряд функций, которые будут рассмотрены ниже.
Код не сложный, но объясню все по пунктам. Куски кода будут идти по очереди, как они расположены в самом классе.
Выполняем необходимые импорты, объявляем класс «InflesActivity» и переменные необходимые для работы программы, а под ними настройки.
boolean SHOW_BUTTON = true; — отображать дополнительные кнопки на экране;
boolean UNZIP = false; — распаковывать zip архивы;
boolean DEL_ZIP = false; — удалять zip архивы (только при включенной опции распаковки);
String COPY_DIR = «Infles»; — путь на SD карте. «/» в начале и конце не ставить.
В функции «onCreate» сперва определяются все кнопки («ActButton», «Delete», «About», «Exit»), затем присваиваются кнопкам Listener’ы и идет проверка переменной «SHOW_BUTTON» и если она ложна, тогда кнопки скрываются.
Обработчик нажатия на кнопку «RUN!». Сначала вызывается диалог прогресса (код дальше), далее объявляются новые переменные для использования в программе. После этого в новом потоке читаются все файлы из папки «Assets», для чего была объявлена переменная «am» типа «AssetManager». Далее функцией «CheckMass()» проверяем, нет ли файла в черном списке названий (почему-то при считывании папки Assets находятся левые папки, причину пока не выяснил, но отсеиваю их), функцией «dirChecker()» проверяется существование папки, и если такой нет, то создается, и после происходит собственно копирование файлов функцией «copy()». Следующий участок кода проверяет, включена ли опция извлечения архивов, и если да, тогда проверяются файлы по расширению, и если находит, извлекает из в текущаю папку (функция «Unzip()»). Архив может содержать подпапки, что демонстрируется в примере, если просто в папке Assets будет подпапка-она не скопируется, буду искать решение. Далее происходит закрытие диалога, потока, программы и вызывается диалог удаления программы — её функция выполнилась и хранить её не имеет смысла, хотя можно нажать Отмена и она останется.
Тут выполняются листенеры остальных трех дополнительных кнопок, которые вызывают свои функции. Функция showDialog(ABOUT) вызывает диалог About (О программе), функция Exit() закрывает активити и останавливает сервис, а функция DeleteApp() открывает диалог деинсталяции приложения.
Эта функция вызывается при открытии диалога «О программе» и прогресс-диалога. Функции передается переменная типа «int» и основываясь на неё вызывается соответствующий диалог. Сами диалоги описывать ну буду — по ним в интернете уже очень много статей, и плюс на developer.android.com есть пример хороший. Скажу только, что для окна «О программе» используется свой xml лэйаут и текст выводится из кода и выводится в виде html кода, для поддержки ссылок.
Это главная функция программы-копирование файлов, да и тут нет ничего предельно сложного, в переменной destinationFile появляется ссылка на файл, потом открывается файл и копируется чустями по 1 кб.
Функция извлечения зип архивов. Тут используется стандартная функция языка Java для работы с архивами.
Две маленьких функции проверки создания папки, если такой нету и поиск значения переменной по массиву, для черного списка файлов.
Ну а тут выводится меню, которое вызывается, как можно догадаться — по хард-енопке «Menu» на любом Андроид-девайсе.
Файлы layout’ов и меню простейшие, поэтому приводить их в статье не буду — кому интересно прошу на SVN на просмотр кода и изучения примера.
Если есть какие пожелания для программы, или предложения, как улучшить код — пишите, постараюсь реализовать.
Еще раз напоминаю, что программа абсолютно бесплатная, можете использовать с воих проектах без ограничений, но желательно оставить оригинальное название и окно «О программе».
Сложности
Первая сложность была связана с адресами путей, в разных местах пришлось по разному описывать их.
Вторая заключалась в невозможности создать подпапки, решил введением извлечения из архива.
Третья — не возможность задать русское название файла или папки. Пока не решил, да и стоит ли?
Четвертая проблема не знаю откуда появилась и как — скрытые файлы без расширения в папке Assets, для которых применяется фильтр.
Источник