Android获取其他应用中的assets资源
最近有这样一个需求: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和反射调用。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对ZaLou.Cn的支持。如果你想了解更多相关内容请查看下面相关链接
- 百篇(5):FeignClient 在不同场景中的应用
- 如何使用Hue上创建一个完整Oozie工作流
- MySQL远程代码执行/权限提升漏洞的分析与实践(CVE-2016-6662)
- 如何在CDH集群上部署Python3运行环境及运行Python作业
- Hacking Aria2 RPC Daemon
- 如何修改CDH集群的DataNoe节点HOSTNAME
- Sparkjava Framework 文件遍历漏洞(CVE-2016-9177)分析与探究
- 绕过混合内容警告 - 在安全的页面加载不安全的内容
- 如何在Kerberos环境使用Flume采集Kafka数据并写入HDFS
- 熊市里生成几个BTC靓号,冷存储起来装死吧
- 傲游浏览器漏洞系列(上)- 任意文件写入,UXSS
- 如何使用Cloudera Manager在线为集群减容
- GitLab 任意文件读取漏洞 (CVE-2016-9086) 和任意用户 token 泄露漏洞
- 如何使用Hue通过数据文件创建Collections
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 使用Python文件读写,自定义分隔符(custom delimiter)
- keras 自定义loss层+接受输入实例
- Python如何对XML 解析
- 使用pytorch 筛选出一定范围的值
- Python爬虫爬取博客实现可视化过程解析
- 在keras里实现自定义上采样层
- 实例讲解PHP中使用命名空间
- PDO::errorCode讲解
- PDO::errorInfo讲解
- PHP的PDO大对象(LOBs)
- PHP抽象类与接口的区别详解
- PDO::exec讲解
- 使用keras框架cnn+ctc_loss识别不定长字符图片操作
- PHP实现的策略模式示例
- 浅谈pytorch中torch.max和F.softmax函数的维度解释