2011-05-19 10 views
6

我遇到一個問題,它讓我發瘋。我有一個靜態HTML文件(assets/help/index.html),需要包含一些圖片。當我想爲不同密度不同的圖像和圖像已經包含在drawable- {LDPI,MDPI,華電國際}我想我會用下面的HTML代碼:使用file:/// android_res/drawable/url在eclipse下工作,但不在生產中

<img src="file:///android_res/drawable/image.png"> 

這下蝕做工精良!不幸的是,在生產版本(使用maven android插件構建)中,顯示html頁面的webview顯示破碎的圖像圖標。

我已經嘗試使用loadUrl和loadDataWithBaseUrl(第一次閱讀文件我自己)打開頁面,後者與文件的基本url:/// android_res/drawable。這兩種嘗試都在eclipse下成功,但在Maven版本中失敗。

所以我解壓縮了Eclipse生成的apk和maven生成的apk,並在兩者之間做了diff -r,因爲必須有明顯的區別。

我很困惑,發現只有一些微不足道的差異(主要是因爲eclipse apk與調試證書和maven之一簽署的官方證書籤署差異)。除此之外,apks的內容是相同的!

有沒有人有任何想法發生了什麼或如何進行揭露更多的信息?

回答

0

我會看看AsssetManager作爲一種訪問與應用程序捆綁在一起的文件的方式。一個教程(代碼示例)可以在here找到。或者你可以把文件放在res/raw中,然後用openRawResource()

1

讀取它們。有理由使用file:/// 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包中。請務必更新複製源中的''包''聲明。

4

我有一個類似的問題,使用proguard,我發現了一個解釋(和一個解決方案!)here

在我的情況下,proguard混淆的R類和android_res/[...]無法找到了。

我解決了向proguard添加規則。cfg:

-keepclassmembers class **.R$* { 
    public static <fields>; 
} 

-keep class **.R$* 

我不知道maven,但希望這有助於。

+0

這是正確的答案,@pieter應該接受它。 IDE似乎從proguard處理中排除生成的代碼,而maven構建使用直接的proguard調用,導致該類混淆,除非指定了適當的規則。由j.c.給出的規則足夠準確,幫助了我。 – zysoft 2014-11-18 12:28:41

相關問題