经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 移动开发 » Android » 查看文章
Android获取其他应用中的assets资源
来源:jb51  时间:2019/1/15 9:17:08  对本文有异议

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

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

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

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

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

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

  1. public static final int CONTEXT_INCLUDE_CODE = 0x00000001;
  2. public static final int CONTEXT_IGNORE_SECURITY = 0x00000002;

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

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

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

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

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

  1. protected void onCreate(Bundle savedInstanceState) {
  2. super.onCreate(savedInstanceState);
  3. setContentView(R.layout.activity_main);
  4. Log.e("GFZY", "onCreate: ");
  5. try {
  6. Context bContext = this.createPackageContext("pers.jibai.matrixtext"
  7. , Context.CONTEXT_INCLUDE_CODE
  8. | Context.CONTEXT_IGNORE_SECURITY);
  9. ClassLoader loader = bContext.getClassLoader();
  10. Class<?> clazz = loader.loadClass("pers.jibai.matrixtext.A");
  11. Object a = clazz.getConstructor().newInstance();
  12. Method getAssetBg = clazz.getMethod("getBgMp4", Context.class);
  13. Log.e("GFZY", "onCreate: " + getAssetBg.getName());
  14. InputStream invoke = (InputStream) getAssetBg.invoke(a, bContext);
  15. BufferedReader reader = new BufferedReader(new InputStreamReader(invoke));
  16. String s = reader.readLine();
  17. reader.close();
  18. ((TextView) findViewById(R.id.t)).setText(s);
  19. } catch (Exception e) {
  20. e.printStackTrace();
  21. Log.e("GFZY", "onCreate: " + e.getMessage());
  22. }
  23. }

这是我的A应用

  1. public class A {
  2. public void asd() {
  3. Log.e("GFZY", "asd:我是matrix ");
  4. }
  5. public InputStream getBgMp4(Context context) {
  6. try {
  7. return context.getAssets().open("asd");
  8. } catch (IOException e) {
  9. e.printStackTrace();
  10. }
  11. return null;
  12. }
  13. }

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

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

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对w3xue的支持。如果你想了解更多相关内容请查看下面相关链接

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号