背景:工做中須要開發一個廣告插件,並提供給其它人使用。這裏就須要把本身的插件程序,打成jar來提供給他人引用。
可是遇到一個問題:插件程序中沒法使用資源文件。
試過如下幾種方式解決:
一、從插件程序中導出jar包
論壇上有人說導出的jar包中沒法包含Drawable等資源文件,一些圖片等數據,須要放到Assert文件中使用。
其實,關於這個問題,我作了嘗試:
首先,須要說明導出jar包含什麼文件是由你導出時選擇來決定的,好比下圖:
若是你選擇了res文件夾,則打包出的jar文件是能夠包含res文件到。
可是包含文件並不表明可使用。若是你想固然在插件程序中使用R.drawable.XXXX等方式獲取
資源會報錯!
固然別人經過R.XX.XX也只能看到本身的資源文件,而沒法獲取jar中的資源文件。
二、獲取jar包中的文件
雖然沒法直接引用資源文件,可是若是外邊程序想獲取某個資源文件時,也是可行的。
其原理是以數據流讀取jar中指定的文件。
好比讀取Assert文件下的icon.jpg文件:
你能夠在插件中封裝一個對外的方法:
publicstatic Drawable getAssertDrawable(Context context,StringfileName){
try {
InputStreaminStream=context.getAssets().open(fileName);
return newBitmapDrawable(BitmapFactory.decodeStream(inStream));
} catch(IOException e) {
Log.e(LOG_TAG, "Assert中"+fileName+"不存在");
}
returnnull;
}
直接使用該方法能夠獲得文件。
後來又嘗試在外部程序,直接使用context.getAssets().open(fileName)方法獲取jar中文件,
讓人喜出望外的是居然成功了。呵呵!
後來分析,外部程序編譯時,其實連同jar包中內容一塊兒混編。jar包中的Assert文件會同外部程序的Assert一塊兒
由AssertManager管理。
因此當你jar包中Assert內部文件和外部Assert中的文件有命名衝突時,編譯器會報錯的。
另外,還有人提供另一種方法來讀取諸如Drawable等文件夾下的文件。
publicstatic Drawable getDrawableForJar(String resName,Classclass){
InputStreaminStream=class.getResourceAsStream(resName);
return newBitmapDrawable(BitmapFactory.decodeStream(inStream));
}
使用class.getResourceAsStream()方法讀取,注意這裏resName是文件的相對路徑,好比jar根目錄下res/drawable/icon.png,
則調用方法爲:class.getResourceAsStream(/res/drawable/icon.png);
這裏主要是採用ClassLoader的下面幾個方法來實現: html
public URL getResource(String name); android
public InputStream getResourceAsStream(String name) 動畫
public static InputStreamgetSystemResourceAsStream(String name) this
public static URL getSystemResource(String name) url
後兩個方法能夠看出是靜態的方法,這幾個方法均可以從Jar中讀取圖片資源,可是對與動畫的gif文件,筆者在嘗試過程當中發現,存在一些差別。 spa
String gifName爲Gif文件在Jar中的相對路徑。 插件
(1)使用了兩個靜態方法 code
或者 htm
這兩種方式能夠成功地讀取gif文件,可是對於gif動畫,顯示出來地是靜態的。 blog
(2)使用其餘兩個方法
再這種方式下動畫能夠正常顯示了。
按以下方法設置:
1. 假設要引用的android工程叫LibProject,引入到的工程叫MainProject;
2.設置LibProject,右鍵->Properties->Android,將Islibrary項選中,而後Apply;
3.設置MainProject,右鍵->->Properties->Android,在Library中,點擊Add按鈕,將LibProject工程加入,Apply便可。