背景:工做中须要开发一个广告插件,并提供给其它人使用。这里就须要把本身的插件程序,打成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便可。