Использование файла:///android_res/drawable/ url работает при затмении, но не в производстве
У меня есть проблема, которая сводит меня с ума. У меня есть статический HTML-файл (assets/help/index.html), который должен включать некоторые изображения. Поскольку мне нужны разные изображения для разных плотностей, а изображения уже включены в drawable-{ldpi,mdpi,hdpi}, я решил использовать следующий HTML-код:
<img src="file:///android_res/drawable/image.png">
Это отлично работает при затмении! К сожалению, в рабочей версии (сборка с плагином maven android) в веб-представлении, отображающем html-страницу, отображаются значки с разбитым изображением.
Я попытался открыть страницу, используя loadUrl и loadDataWithBaseUrl (сначала читая файл сам), последний с базовым URL-адресом файла:///android_res/drawable. Обе попытки увенчались успехом при затмении, но потерпели неудачу в версии maven.
Таким образом, я распаковал сгенерированный apk Eclipse и сгенерированный maven, и сделал между ними diff -r, потому что между ними явно должна быть разница.
Я сбит с толку, обнаружив лишь несколько тривиальных различий (в основном, подписи различий, поскольку eclipse apk подписан с сертификатом отладки, а maven - с моим официальным сертификатом). Кроме того, содержание apks идентичны!
Кто-нибудь имеет какие-либо идеи, что происходит или как открыть больше информации?
3 ответа
У меня была похожая проблема с использованием Proguard, и я нашел объяснение (и решение!) Здесь.
В моем случае proguard запутал R класс и android_res/[...] больше не мог быть найден.
Я решил добавить правило в proguard.cfg:
-keepclassmembers class **.R$* {
public static <fields>;
}
-keep class **.R$*
Я не знаю о Maven, но надеюсь, что это помогает.
Есть причины использовать файл:///android_res вместо file:///android_asset. Одним из них является то, что проекты библиотек Android не могут иметь активов.
Если вам захочется получить доступ к ресурсам, которые определены в проекте библиотеки, из WebView и переименовать имя пакета, используя соответствующую опцию android-maven-plugin (которая, в свою очередь, зависит от некоторой функции Android SDK), тогда вы нажмете довольно странная ошибка
Android делает это в android.webkit.BrowserFrame::inputStreamForAndroidResource (по крайней мере, в 4.1.2):
final Class<?> d = mContext.getApplicationContext().getClassLoader().loadClass(
mContext.getPackageName() + ".R$" + subClassName);
Это динамический поиск класса R, и он использует имя пакета приложения в качестве имени пакета Java. Однако это не работает, потому что класс R в переименованном имени пакета не будет существовать.
Возможный обходной путь заключается в следующем: во время сборки выпуска динамически создайте копию своего реального класса R и поместите его в пакет Java, который соответствует переименованному имени пакета приложения. Обязательно обновите оператор ''package'' в скопированном источнике.
Я хотел бы взглянуть на AsssetManager как способ доступа к файлам, прилагаемым к приложению. Учебник (с примером кода) можно найти здесь. Или вы можете поместить файл в res/raw
и читать их с помощью openRawResource()