摘要:最近有这样一个需求:A应用在一定条件下出发某个逻辑后,需要从B应用中获取一些资源(assets下的mp4视频、还有drawable下的一些图片用作背景),具体需求就不说啦哈哈,用一张图来表示应该更明白:

脚本宝典收集整理的这篇文章主要介绍了

Android获取其他应用中的assets资源

脚本宝典小编觉得挺不错的,现在分享给大家,也给大家做个参考,希望能帮助你少写一行代码,多一份安全和惬意。

最近有这样一个需求:A应用在一定条件下出发某个逻辑后,需要从B应用中获取一些资源(assets下的mp4视频、还有drawable下的一些图片用作背景),具体需求就不说啦哈哈,用一张图来表示应该更明白:

Android获取其他应用中的assets资源-脚本宝典

A和B应用其实是1对多的关系,不同的B应用需要从他们自己的地方获取到资源给A。

一般我们获取app内的资源肯定是要获取到Resource这个类,而Resource是通过Context类的getResource获取到了,所以我们只需要获取到B应用的Context类就可以了。

可是其他App的Context怎么获取?其实Context 自己就有构建Context的方法:createPackageContext。

   @Override   public Context createPackageContext(String packageName, int flags)     throws PackageManager.NameNotFoundException {     return mBase.createPackageContext(packageName, flags);   }

通过我们只需要传入所需要App的包名,就可以构造出对应App的Context。第二个参数是一个配置标记。

 public static final int CONTEXT_INCLUDE_CODE = 0x00000001; public static final int CONTEXT_IGNORE_SECURITY = 0x00000002;

第一个标记是让我们可以通过类加载器去构建相关类,但是需要第二个参数的配合:忽略安全限制。一般Flag就配置这样个类型。

在创建出Context之后,就可以通过获取Resource类去获取对应的资源了。

 //栗子:获取一个drawable 的id       int identifier = bContext.getResources().getIdentifier("bg", "drawable", bContext.getPackageName());

但是assets中的资源就没有这么方便了。虽然通过context可以获取到对应的assetsManager,但是在操作assetsManager获取资源的时候就出现问题了:在assets中获取资源一般都是通过文件或者流的方式,但是我在操作的时候直接抛出异常,说找不到我的资源名字。我这里检查了好几遍了,就是获取不到。。。

那么这种情况下我想能不能通过反射去拿到我想需要的资源呢?

 protected void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     setContentView(R.layout.activity_main);     Log.e("GFZY", "onCreate: ");     try {       Context bContext = this.createPackageContext("pers.jibai.matrixtext"           , Context.CONTEXT_INCLUDE_CODE               | Context.CONTEXT_IGNORE_SECURITY);       ClassLoader loader = bContext.getClassLoader();       Class clazz = loader.loadClass("pers.jibai.matrixtext.A");       Object a = clazz.getConstructor().newInstance();       Method getAssetBg = clazz.getMethod("getBgMp4", Context.class);       Log.e("GFZY", "onCreate: " + getAssetBg.getName());       InputStream invoke = (InputStream) getAssetBg.invoke(a, bContext);       BufferedReader reader = new BufferedReader(new InputStreamReader(invoke));       String s = reader.readLine();       reader.close();       ((TextView) findViewById(R.id.t)).setText(s);     } catch (Exception e) {       e.printStackTrace();       Log.e("GFZY", "onCreate: " + e.getMessage());     }   }

这是我的A应用

 public class A {   public void asd() {     Log.e("GFZY", "asd:我是matrix ");   }   public InputStream getBgMp4(Context context) {     try {       return context.getAssets().open("asd");     } catch (IOException e) {       e.printStackTrace();     }     return null;   } }

这是B应用,我在B应用中实现了一个方法,去获取A中所需要的资源,然后通过反射调用这个方法,这种方式就可以拿到我想要的资源了,而且这种方法目前发现是万能方法哈哈。

具体的例子和实现就不拷贝了,其实思路很简单,就是两步:构建Context和反射调用。

总结

android教程
脚本网站
android studio

总结

以上是脚本宝典为你收集整理的

Android获取其他应用中的assets资源

全部内容,希望文章能够帮你解决

Android获取其他应用中的assets资源

所遇到的程序开发问题,欢迎加入QQ群277859234一起讨论学习。如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典网站推荐给程序员好友。 本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。

80%的人都看过