- Assets (Активы)
- Чтение файлов
- Используем собственные шрифты
- Загрузка локальных файлов из активов в WebView
- Получаем список файлов в папке assets
- Ограничение на размер файлов
- Using Android Assets
- Add Asset to Project
- Reading Assets
- Reading Binary Assets
- Running the Application
- Asset Manager Class
- Definition
- Remarks
- Properties
- Methods
- Explicit Interface Implementations
- Extension Methods
- Использование ресурсов Android
- Добавить ресурс в Project
- Чтение ресурсов
- Чтение двоичных ресурсов
- Запуск приложения
- AssetManager: как форсировать получение пользователем обновленной статики
- Шаг 1. Подготовка файлов.
- Шаг 2. Подготовка инструментов.
- Шаг 3. Орудуем подготовленными инструментами над подготовленными файлами.
- Шаг 4. Обновляем версию на продакшене и принуждаем браузер пользователя загружать обновленные файлы.
- Если говорить кратко
- Немного о другом
- Полезные ссылки по теме
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. При превышении размера у вас может появиться ошибка:
Я не сталкивался, поэтому рецепт решения проблемы не предлагаю.
Источник
Using Android Assets
Assets provide a way to include arbitrary files like text, xml, fonts, music, and video in your application. If you try to include these files as «resources», Android will process them into its resource system and you will not be able to get the raw data. If you want to access data untouched, Assets are one way to do it.
Assets added to your project will show up just like a file system that can read from by your application using AssetManager. In this simple demo, we are going to add a text file asset to our project, read it using AssetManager , and display it in a TextView.
Add Asset to Project
Assets go in the Assets folder of your project. Add a new text file to this folder called read_asset.txt . Place some text in it like «I came from an asset!».
Visual Studio should have set the Build Action for this file to AndroidAsset:
Visual Studio for Mac should have set the Build Action for this file to AndroidAsset:
Selecting the correct BuildAction ensures that the file will be packaged into the APK at compile time.
Reading Assets
Assets are read using an AssetManager. An instance of the AssetManager is available by accessing the Assets property on an Android.Content.Context , such as an Activity. In the following code, we open our read_asset.txt asset, read the contents, and display it using a TextView.
Reading Binary Assets
The use of StreamReader in the above example is ideal for text assets. For binary assets, use the following code:
Running the Application
Run the application and you should see the following:
Источник
Asset Manager Class
Definition
Some information relates to prerelease product that may be substantially modified before it’s released. Microsoft makes no warranties, express or implied, with respect to the information provided here.
Provides access to an application’s raw asset files; see Resources for the way most applications will want to retrieve their resource data.
Remarks
Portions of this page are modifications based on work created and shared by the Android Open Source Project and used according to terms described in the Creative Commons 2.5 Attribution License.
Properties
Returns the runtime class of this Object .
(Inherited from Object)
The handle to the underlying Android instance.
(Inherited from Object)
This API supports the Mono for Android infrastructure and is not intended to be used directly from your code.
(Inherited from Object)
This API supports the Mono for Android infrastructure and is not intended to be used directly from your code.
(Inherited from Object)
Methods
Creates and returns a copy of this object.
(Inherited from Object)
Close this asset manager.
Indicates whether some other object is «equal to» this one.
(Inherited from Object)
Returns a hash code value for the object.
(Inherited from Object)
Get the locales that this asset manager contains data for.
Called by the garbage collector on an object when garbage collection determines that there are no more references to the object.
(Inherited from Object)
Return a String array of all the assets at the given path.
Wakes up a single thread that is waiting on this object’s monitor.
(Inherited from Object)
Wakes up all threads that are waiting on this object’s monitor.
(Inherited from Object)
Open an asset using ACCESS_STREAMING mode.
Open an asset using ACCESS_STREAMING mode.
Open an uncompressed asset by mmapping it and returning an AssetFileDescriptor .
Open a non-asset as an asset by mmapping it and returning an AssetFileDescriptor .
Open a non-asset as an asset by mmapping it and returning an AssetFileDescriptor .
Retrieve a parser for a compiled XML file.
Retrieve a parser for a compiled XML file.
Sets the Handle property.
(Inherited from Object)
Returns a string representation of the object.
(Inherited from Object)
Causes the current thread to wait until another thread invokes the java.lang.Object#notify() method or the java.lang.Object#notifyAll() method for this object.
(Inherited from Object)
Causes the current thread to wait until another thread invokes the java.lang.Object#notify() method or the java.lang.Object#notifyAll() method for this object.
(Inherited from Object)
Causes the current thread to wait until another thread invokes the java.lang.Object#notify() method or the java.lang.Object#notifyAll() method for this object.
(Inherited from Object)
Explicit Interface Implementations
IJavaPeerable.Disposed() | (Inherited from Object) |
IJavaPeerable.DisposeUnlessReferenced() | (Inherited from Object) |
IJavaPeerable.Finalized() | (Inherited from Object) |
IJavaPeerable.JniManagedPeerState | (Inherited from Object) |
IJavaPeerable.SetJniIdentityHashCode(Int32) | (Inherited from Object) |
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) | (Inherited from Object) |
IJavaPeerable.SetPeerReference(JniObjectReference) | (Inherited from Object) |
Extension Methods
Performs an Android runtime-checked type conversion.
Источник
Использование ресурсов Android
Ресурсы предоставляют возможность включать в приложение произвольные файлы, такие как текст, XML, шрифты, музыка и видео. Если вы попытаетесь включить эти файлы как «Resources», Android обработает их в своей системе ресурсов и вы не сможете получить необработанные данные. Если вы хотите получить доступ к данным без вмешательства пользователя, ресурсы являются одним из способов сделать это.
Ресурсы, добавленные в проект, будут отображаться так же, как файловая система, способная выполнять чтение из приложения с помощью ассетманажер. В этой простой демонстрации мы добавим к нашему проекту ресурс текстового файла, прочесть его с помощью AssetManager и отобразить в TextView.
Добавить ресурс в Project
Ресурсы находятся в Assets папке проекта. Добавьте в эту папку новый текстовый файл с именем read_asset.txt . Поместите в него некоторый текст, например «я пришел от ресурса!».
Visual Studio должен задать для этого файла действие сборкиAndroidAsset:
Visual Studio для Mac должен задать для этого файла действие сборкиAndroidAsset:
Если выбрать правильное действие , это гарантирует, что файл будет УПАКОВАН в APK во время компиляции.
Чтение ресурсов
Ресурсы считываются с помощью ассетманажер. Экземпляр объекта AssetManager доступен при доступе к свойству AssetManager в Android.Content.Context , такому как действие. В следующем коде мы откроем наш ресурс read_asset.txt , прочтите его содержимое и отобразите с помощью TextView.
Чтение двоичных ресурсов
Использование StreamReader в приведенном выше примере идеально подходит для текстовых ресурсов. Для двоичных ресурсов используйте следующий код:
Запуск приложения
Запустите приложение, и вы должны увидеть следующее:
Источник
AssetManager: как форсировать получение пользователем обновленной статики
При разработке веб-приложений существует одна общеизвестная проблема. Мы, программисты, пишем новый javascript-код, стили в css, меняем статику… И статика эта как правило кешируется браузером пользователя и может оставаться в кеше на довольно долгое время (и это на самом деле правильно, ибо может ускорить загрузку страниц в разы).
Но что же делать, если мы поменяли статику? Как заставить пользователя сбросить кеш и обновить эти файлы? Существуют некоторые общепринятые способы, например, добавлять версионную метку к имени файла, или добавлять временную метку в GET-параметре при подключении файла.
В случае, если вы используете фреймворк Yii, вы также можете указывать версии или временные метки у файлов скриптов и стилей при подключении, однако за этим постоянно нужно следить, а в случае Yii еще и следить за отсутствием конфликтов (когда, допустим, виджет и вьюшка используют один и тот же скрипт, но с разными временными метками).
Собственно говоря, в Yii можно организовать более цивилизованный подход к этому делу.
Шаг 1. Подготовка файлов.
Создаем подпапку assets в папке protected вашего веб-приложения.
Помещаем в эту папку всю статику. Какие-то файлы, возможно, придется оставить в корне веб-приложения, если на них нужны постоянные внешние ссылки (например, фавиконка, логотип, какие-то документы).
Структура файлов может выглядеть примерно так:
Шаг 2. Подготовка инструментов.
Скорее всего у вас уже есть переопределенный класс Controller, который вы используете в качестве базового для всех остальных контроллеров.
Мы его немного изменим, чтобы обеспечить работу с ассетами:
Все просто.
Здесь мы добавили геттер, который в первый раз публикует ассеты из папки /protected/assets и сохраняет путь в приватное свойство _assetsBase, а в последующие разы просто возвращает значение этого приватного свойства.
У метода publish() класса CAssetManager есть несколько интересных параметров.
Вот сигнатура метода:
И краткое описание параметров:
$path — собственно путь до папки ассетов, которую мы будем публиковать;
$hashByName — определяет, публиковать ли имя папки как есть, или хешировать. Благодаря этому параметру и происходит вся магия, о которой будет рассказано дальше;
$level — определяет степень вложенности папок для публикации (-1 — все подпапки рекурсивно);
$forceCopy — определяет, копировать ли файлы принудительно, даже если они уже существуют. Устанавливаем этот параметр в YII_DEBUG, за счет чего на локальной машинке наши скрипты будут постоянно обновляться, а на продакшене — только в случае необходимости (на продакшене YII_DEBUG должен быть выставлен в false).
Шаг 3. Орудуем подготовленными инструментами над подготовленными файлами.
То самое свойство assetsBase, для которого мы написали геттер чуть выше — можем теперь использовать везде.
Сейчас во вьюшках и лейаутах можем писать что-то типо:
или
И мы можем писать именно так, потому что $this в данном случае — это экземпляр класса Controller от которого наследуются все наши контроллеры и который передается во вьюшки и лейауты.
С виджетами дело обстоит немного по-другому, нужен свой подход, поскольку вьюшки виджета выполняются не в контексте контроллера, а в контексте виждета, поэтому для подключения Javascript файла во вьюшке виджета будем писать:
Шаг 4. Обновляем версию на продакшене и принуждаем браузер пользователя загружать обновленные файлы.
Это самый важный момент и именно его упускают многие разработчики из виду, в том числе и я когда-то.
Читая многие статьи по Yii может показаться, что для того, чтобы пользователь получил обновленные файлы статики — достаточно залить их в /protected/assets почистить папочку /assets в корне сайта (если конечно используется AssetManager) и вуаля — у пользователя все обновится само собой.
Но это совсем не так!
Автогенерируемые имена подпапок в папочке /assets в корне веб-приложения основываются на хеше имени папки /protected/assets и не меняются от раза к разу, даже если вы чистите папочку /assets в корне веб-приложения. Они восстанавливаются в прежнем виде. А значит браузер пользователя не «просекает», что что-то поменялось до тех пор, пока не истечет время кеширования.
По крайней мере так было до недавнего времени. И эта проблема обсуждалась в этом топике, после чего Александр Макаров нашел обходной путь и своим коммитом от 8 ноября 2011 года исправил ситуацию.
Теперь, второй параметр метода publish() класса CAssetManager — параметр $hashByName, установленный в false — вынуждает Yii строить имена подпапок в папке /assets в корне веб-приложения уже на основании хеша имени папки со статикой, а также даты модификации этой папки.
Благодаря этому мы можем сделать очень простой финт при деплое файлов статики приложения:
выполняем эту команду в консоли вашего линуксового сервера (полагаем, что сайт все-таки развернут под линуксом) и при следующем обращении к статике Yii сгенерирует новые имена ассетов!
А значит, пользователь, открывший страницу загрузит абсолютно новенькие свеженькие улучшенные скрипты, стили, картинки и т.п.
Если говорить кратко
Нужно просто:
- Всю статику вынести в папку /protected/assets
- Расширить базовый класс контроллера так, как описано выше
- Везде использовать assetsBase в качестве основы путей до статики
- При обновлении статики на сайте выполнить команду которая приведет к изменению даты модификации папки /protected/assets, а значит генерации нового хеша в папке /assets в корне сайта
- Выгода: вы можете быть уверены, что пользователи получают самую последнюю версию ваших скриптов, стилей и т.п.
Немного о другом
Кстати говоря, насколько мне известно, например, в Ruby on Rails данная проблема уже решена.
В Yii версии 2, которая находится в стадии разработки данная проблема также скорее всего будет решена.
В обсуждении решения данной проблемы для Yii 2 можно поучастовать на форуме (доступ открыт только для активных участников).
Также, еще одной интересной фишкой является автоматическая минификация скриптов и css. На данный момент она не реализована на уровне фреймворка, но реализована в некоторых расширениях, но это уже тема другой статьи…
Полезные ссылки по теме
- Документация к классу CAssetManager.
- Обсуждение данной темы на форуме Yii
- Обсуждение данной проблемы для новой версии Yii 2 (доступно для только активных пользователей)
- Расширения для минификации:
- escriptboost
- clientscriptpacker
- minscript
- minifyclientscript
- dynamicres
- Английская версия данной статьи
- Еще одна статья, описывающая приемы работы с CAssetManager
PS: Отмечу, что данная статья не является ни переводом, ни кросспостом, ибо английскую версию статьи писал также я для базы знаний Yii, но русская версия выполнена более качественно и понятно (в силу разного уровня знания языков).
Источник