温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2021-01-14 15:41:47 来源:亿速云 阅读:149 作者:Leah 栏目:移动开发

今天就跟大家聊聊有关Android怎么获取其他应用中的assets资源,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

一般我们获取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;
  }
}

看完上述内容,你们对Android怎么获取其他应用中的assets资源有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI