Android Studio ARouter插件
点一下图上的定位按钮就会跳到对应的activity当中去
小菜前段时间研究了 Android Native 与 Flutter 之间的交互;若两端均需要相同资源文件,若不能共享则势必会增加整体包大小;今天和尚研究一下如何通过 Android Native 获取 Flutter 中资源文件;
官网对于 assets 介绍很简洁,使用过程代码量也很少,虽简洁但依然值得研究;小菜以 Android 为主工程,Flutter 作为 Module 进行测试;
小菜在学习 Android 与 Flutter 交互时会用到 FlutterView 作为桥接控件;而对于资源文件的获取也同样适用;其核心方法是 getLookupKeyForAsset;
逐层分析源码,通过 getLookupKeyForAsset 方法我们可以获取资源文件的路径,根目录是固定的 flutter_assets 而非 Module 名;
public String getLookupKeyForAsset(String asset) {
return FlutterMain.getLookupKeyForAsset(asset);
}
public static String getLookupKeyForAsset(String asset) {
return fromFlutterAssets(asset);
}
private static String fromFlutterAssets(String filePath) {
return sFlutterAssetsDir + File.separator + filePath;
}
private static String sFlutterAssetsDir = "flutter_assets";
小菜通过 getLookupKeyForAsset 获取文件路径,以 images/ic_launcher.png 图片为例,借助 assetManager.open 转为流信息转为 Bitmap 进行展示;
// 文件路径:flutter_assets/images/ic_launcher.png
try {
AssetManager assetManager = getAssets();
InputStream is = assetManager.open(flutterView.getLookupKeyForAsset("images/ic_launcher.png"));
Bitmap bitmap = BitmapFactory.decodeStream(is);
flutterIv.setImageBitmap(bitmap);
} catch (Exception e) {
System.out.println("异常信息:" + e.toString());
}
小菜测试可以用如下方式获取资源文件路径;
// Activity
flutterView.getLookupKeyForAsset("images/ic_launcher.png");
// Fragment
(FlutterView) getView().getLookupKeyForAsset("images/ic_launcher.png");
// 通用
FlutterMain.getLookupKeyForAsset("images/ic_launcher.png");
另一种常用的方式是以插件方式,Flutter 在使用 AndroidView 方式嵌入 Native View 与 Android 进行交互时;核心方法同样是 lookupKeyForAsset 获取资源路径,之后便是用原生方法解析 assets 资源文件;
小菜测试时主要注意两点:
// 文件路径:flutter_assets/images/ic_launcher.png
// Flutter 端
Container(
child: AndroidView(
viewType: "com.ace.ace_demo01/method_layout",
creationParamsCodec: const StandardMessageCodec(),
creationParams: {'method_layout_size': 450}),
color: Colors.greenAccent,
height: 200.0)
// Android 端
final String key = "NMethodLayout";
if (this.hasPlugin(key)) return;
PluginRegistry.Registrar registrar = this.registrarFor(key);
registrar.platformViewRegistry()
.registerViewFactory("com.ace.ace_demo01/method_layout", new NMethodLayoutFactory(registrar.messenger()));
try {
AssetManager assetManager = registrar.context().getAssets();
String assetKey = registrar.lookupKeyForAsset("images/ic_launcher.png");
AssetFileDescriptor fileDescriptor = assetManager.openFd(assetKey);
Bitmap bitmap = BitmapFactory.decodeStream(fileDescriptor.createInputStream());
mIv.setImageBitmap(bitmap);
} catch (Exception e) {
e.printStackTrace();
}
无论是 FlutterView 还是 PluginRegistry.Registrar 方式均需 lookupKeyForAsset 获取 Flutter 端资源文件路径,且获取类型与原生 assets 中一致;小菜测试获取一个 json 文件进行解析;
final String key = "NMethodLayout";
if (this.hasPlugin(key)) return;
PluginRegistry.Registrar registrar = this.registrarFor(key);
registrar.platformViewRegistry()
.registerViewFactory("com.ace.ace_demo01/method_layout", new NMethodLayoutFactory(registrar.messenger()));
try {
AssetManager assetManager = registrar.context().getAssets();
Log.e("===getJson===", getJson(registrar.lookupKeyForAsset("images/star.json")));
} catch (Exception e) {
e.printStackTrace();
}
public String getJson(String fileName) {
StringBuilder stringBuilder = new StringBuilder();
try {
//获取assets资源管理器
AssetManager assetManager = getAssets();
//通过管理器打开文件并读取
InputStreamReader inputReader = new InputStreamReader( assetManager.open(fileName) );
BufferedReader bufReader = new BufferedReader(inputReader);
String line="", result="";
while((line = bufReader.readLine()) != null)
result += line;
return result;
} catch (IOException e) {
e.printStackTrace();
}
return stringBuilder.toString();
}
// ===getJson===: { "stars": [ { "name": "水瓶座", "name_en": "Aquarius" }, { "name": "双鱼座", "name_en": "Pisces" }, { "name": "白羊座", "name_en": "Aries" }, { "name": "金牛座", "name_en": "Taurus" }, { "name": "双子座", "name_en": "Gemini" }, { "name": "巨蟹座", "name_en": "Cancer" }, { "name": "狮子座", "name_en": "Leo" }, { "name": "处女座", "name_en": "Virgo" }, { "name": "天秤座", "name_en": "Libra" }, { "name": "天蝎座", "name_en": "Scorpio" }, { "name": "射手座", "name_en": "Sagittarius" }, { "name": "摩羯座", "name_en": "Capricorn" } ]}
小菜还未成功尝试 Flutter 获取 Native 的资源文件,依旧是从零探索中;如有错误请多多指导!
来源: 阿策小和尚
微信关注我们
转载内容版权归作者及来源网站所有!
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。
Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。
Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。
Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。