获得外部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;
 }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值