读书人

取得外部Apk资源的实体类[转]

发布时间: 2012-09-14 11:53:44 作者: rapoo

获得外部Apk资源的实体类[转]

获取外部Apk资源的实体类:

public class ForeignPackage {
?
?public final static String TAG = "ForeignPackage";
?
?private String packageName;
?private Context foreignCtx;

?public ForeignPackage(Context ctx, String packageName) throws NameNotFoundException{
??this.packageName = packageName;
??foreignCtx = ctx.createPackageContext(packageName, Context.CONTEXT_INCLUDE_CODE | Context.CONTEXT_IGNORE_SECURITY);
?}
?
?//获取该apk的上下文
?public Context getContext(){
??return foreignCtx;
?}
?
?//获取该apk的asset
?public AssetManager getAssets(){
??return foreignCtx.getAssets();
?}
?
?//获取该apk的Class
?public Class<?> loadClass(String className) throws ClassNotFoundException{
??return foreignCtx.getClassLoader().loadClass(className);
?}
?
?//ID: 形如R.layout.main
?public int getResourceID(String sID){
??int mID = -1;
??if(sID.indexOf('.') == -1 || sID.indexOf('.') == sID.length() - 1){
???return -1;
??}
??
??//String className = "com.apktest.R$attr";
??String className = packageName + "." + sID.substring(0, sID.lastIndexOf('.')).replace('.', '$');
??String idName = sID.substring(sID.lastIndexOf('.') + 1);
??try {
???Class<?> c = loadClass(className);
???Field field = c.getField(idName);
???mID = field.getInt(null);
??} catch (ClassNotFoundException e) {
???Log.e(TAG, "className Not Found:" + className);
???return -1;
??} catch (SecurityException e) {
???Log.e(TAG, "SecurityException:" + sID);
???return -1;
??} catch (NoSuchFieldException e) {
???Log.e(TAG, "The Field Not Found:" + idName);
???return -1;
??} catch (Exception e) {
???Log.e(TAG, "Exception:" + e);
???return -1;
??}?
??
??return mID;
?}
?
?//获取该apk包中的string资源
?public String getString(String id){
??int mID = getResourceID(id);
??if(mID == -1){
???return null;
??}
??
??String s = null;
??try {
???s = foreignCtx.getResources().getString(mID);
??} catch (Exception e) {
???Log.e(TAG, "Exception:" + e);
??}
??
??return s;
?}
?
?//获取该apk包中的color资源
?public int getColor(String id){
??int mID = getResourceID(id);
??if(mID == -1){
???return -1;
??}
??
??int color = -1;
??try {
???color = foreignCtx.getResources().getColor(mID);
??} catch (Exception e) {
???Log.e(TAG, "Exception:" + e);
??}
??
??return color;
?}
?
?//获取该apk包中的drawable资源
?public Drawable getDrawable(String id){
??int mID = getResourceID(id);
??if(mID == -1){
???return null;
??}
??
??Drawable d = null;
??try {
???d = foreignCtx.getResources().getDrawable(mID);
??} catch (Exception e) {
???Log.e(TAG, "Exception:" + e);
??}
??
??return d;
?}
?
?//获取该apk包中的layout资源
?public View getLayout(String id){
??int mID = getResourceID(id);
??if(mID == -1){
???return null;
??}
??
??LayoutInflater inflate? = (LayoutInflater)foreignCtx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
??return inflate.inflate(mID, null);
?}
?
?//获取该apk包中的animation资源
?public Animation getAnimation(String id){
??int mID = getResourceID(id);
??if(mID == -1){
???return null;
??}
??
??Animation a = null;
??try {
???a = AnimationUtils.loadAnimation(foreignCtx, mID);
??} catch (Exception e) {
???Log.e(TAG, "Exception:" + e);
??}
??
??return a;
?}

?//获取该apk包中的类实力,className为类名,args为类的构造函数参数
?public Object getClassInstance(String className, Object...args) throws ClassNotFoundException{
??Class<?> c = loadClass(className);
??try {
???Class<?>[] cs = new Class<?>[args.length];
???int i = 0;
???for(Object arg : args){
????cs[i++] = InstanceMapping.classTypeFormat(arg.getClass());
???}
???Constructor<?> ct = c.getConstructor(cs);
???return ct.newInstance(args);
??} catch (SecurityException e) {
???e.printStackTrace();
??} catch (NoSuchMethodException e) {
???e.printStackTrace();
??} catch (IllegalArgumentException e) {
???e.printStackTrace();
??} catch (InstantiationException e) {
???e.printStackTrace();
??} catch (IllegalAccessException e) {
???e.printStackTrace();
??} catch (InvocationTargetException e) {
???e.printStackTrace();
??}
??return null;
?}
}

读书人网 >移动开发

热点推荐