重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
今天就跟大家聊聊有关Android怎么获取其他应用中的assets资源,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
成都创新互联是一家专业提供巩留企业网站建设,专注与成都网站建设、网站设计、H5开发、小程序制作等业务。10年已为巩留众多企业、政府机构等服务。创新互联专业网络公司优惠进行中。
一般我们获取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资源有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注创新互联行业资讯频道,感谢大家的支持。