当前位置: 移动技术网 > 移动技术>移动开发>Android > Android获取其他应用中的assets资源

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

2019年07月30日  | 移动技术网移动技术  | 我要评论
最近有这样一个需求:a应用在一定条件下出发某个逻辑后,需要从b应用中获取一些资源(assets下的mp4视频、还有drawable下的一些图片用作背景),具体需求就不说啦哈

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

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和反射调用。

总结

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

如您对本文有疑问或者有任何想说的,请 点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网