写点什么

Agora Flutter SDK:一套代码,实现双端通话(三)

  • 2019-11-30
  • 本文字数:2468 字

    阅读完需:约 8 分钟

Agora Flutter SDK:一套代码,实现双端通话(三)

2 Flutter 和 Native 的交互

我们这里说的 Native 指的是 Android 平台。


那既然要相互通信,就需要将 Flutter 集成到 Android 工程中来,不清楚的如何集成可以看看这里


这里有一点需要注意,就是我们在 Android 代码中需要初始化 Dart VM,不然我们在使用 getFlutterView() 来获取一个 Flutter View 的时候会抛出如下异常:


Caused by: java.lang.IllegalStateException: ensureInitializationComplete must be called after startInitialization        at io.flutter.view.FlutterMain.ensureInitializationComplete(FlutterMain.java:178)...
复制代码


我们有两种方式来执行初始化操作:一个是直接让我们的 Application 继承 FlutterApplication,另外一个是需要我们在我们自己的 Application 中手动初始化:


方法一:


public class App extends FlutterApplication {    }
复制代码


方法二:


public class App extends Application {    @Override    public void onCreate() {    super.onCreate();    // 初始化 Flutter  Flutter.startInitialization(this);    }  }
复制代码


其实方法一中的 FlutterApplication 中在其 onCreate() 方法中干了同样的事情,部分代码如下:


public class FlutterApplication extends Application {
... @CallSuper public void onCreate() { super.onCreate(); FlutterMain.startInitialization(this); } ...}
复制代码


如果我们的 App 只是需要使用 Flutter 在屏幕上绘制 UI,那么没问题, Flutter 框架能够独立完成这些事情。但是在实际的开发中,难免会需要调用 Native 的功能,如:定位,相机,电池等等。这个时候就需要 Flutter 和 Native 通信了。


官网上有一个案例是使用 MethodChannel 来调用给本地的方法获取手机电量。


其实我们还可以使用另外一个类进行通信,叫做 BasicMessageChannel,先来看看它如果创建:


// javabasicMessageChannel = new BasicMessageChannel<String>(getFlutterView(), "foo", StringCodec.INSTANCE);
复制代码


BasicMessageChannel 需要三个参数,第一个是 BinaryMessenger;第二个是通道名称,第三个是交互数据类型的编解码器,我们接下来的例子中的交互数据类型为 String ,所以这里传递的是 StringCodec.INSTANCE,Flutter 中还有其他类型的编解码器 BinaryCodec,JSONMessageCodec 等,他们都有一个共同的父类 MessageCodec。 所以我们也可以根据规则创建自己编解码器。


接下来创建的例子是:Flutter 给 Android 发送一条消息,Android 收到消息之后给 Flutter 回复一条消息,反之亦然。


先来看看 Android 端的部分代码:


// 接收 Flutter 发送的消息
basicMessageChannel.setMessageHandler(new BasicMessageChannel.MessageHandler<String>() { @Override public void onMessage(final String s, final BasicMessageChannel.Reply<String> reply) { // 接收到的消息 linearMessageContainer.addView(buildMessage(s, true)); scrollToBottom(); // 延迟 500ms 回复 flutterContainer.postDelayed(new Runnable() { @Override public void run() { // 回复 Flutter String replyMsg = "Android : " + new Random().nextInt(100); linearMessageContainer.addView(buildMessage(replyMsg, false)); scrollToBottom(); // 回复 reply.reply(replyMsg); } }, 500);
}}); // ---------------------------------------------- // 向 Flutter 发送消息 basicMessageChannel.send(message, new BasicMessageChannel.Reply<String>() { @Override public void reply(final String s) { linearMessageContainer.postDelayed(new Runnable() { @Override public void run() { // Flutter 的回复 linearMessageContainer.addView(buildMessage(s, true)); scrollToBottom(); } }, 500);
} });
复制代码


类似的,Flutter 这边的部分代码如下:


  // 消息通道  static const BasicMessageChannel<String> channel =      BasicMessageChannel<String>('foo', StringCodec());    // ----------------------------------------------
// 接收 Android 发送过来的消息,并且回复 channel.setMessageHandler((String message) async { String replyMessage = 'Flutter: ${Random().nextInt(100)}'; setState(() { // 收到的android 端的消息 _messageWidgets.add(_buildMessageWidget(message, true)); _scrollToBottom(); });
Future.delayed(const Duration(milliseconds: 500), () { setState(() { // 回复给 android 端的消息 _messageWidgets.add(_buildMessageWidget(replyMessage, false)); _scrollToBottom(); }); }); // 回复 return replyMessage; }); // ---------------------------------------------- // 向 Android 发送消息 void _sendMessageToAndroid(String message) { setState(() { _messageWidgets.add(_buildMessageWidget(message, false)); _scrollToBottom(); }); // 向 Android 端发送发送消息并处理 Android 端给的回复 channel.send(message).then((value) { setState(() { _messageWidgets.add(_buildMessageWidget(value, true)); _scrollToBottom(); }); }); }
复制代码


最后的效果如下:屏幕的上半部分为 Android,下半部分为 Flutter



如有问题,欢迎交流,谢谢!


源码地址:


https://github.com/liusilong/FlutterRendering


https://github.com/liusilong/FlutterAndroidCommunicate


本文转载自公众号声网 Agora(ID:shengwang-agora)。


原文链接:


https://mp.weixin.qq.com/s/hawD7myykCkVJbDbpRZHMw


2019-11-30 15:04744

评论

发布
暂无评论
发现更多内容

win版4K Video Downloader Plus(4K视频下载器) v1.8.0特别版

iMac小白

ebay商品详情数据接口|ebay API接口指南

tbapi

ebay api ebay商品详情接口 ebay商品数据采集 易贝商品详情接口 易贝API

1688商品详情数据接口|1688API接口指南

tbapi

1688 1688商品详情接口 1688API 1688商品详情数据接口

一个改行做程序员的老ToB市场人的心路历程

客户在哪儿AI

人工智能 ToB营销 ToB增长 大客户营销

基于Java+SpringBoot+Vue扶农助农政策管理系统设计和实现

hunter_coder

后端开发

win版Gilisoft Video DRM Protection(视频DRM保护辅助工具) v8.0 激活版

iMac小白

义乌购商品详情API接口:探索海量商品的深度信息

tbapi

义乌购商品详情数据接口 义乌购API 义乌购商品数据采集

企业级移动应用平台是什么?

WorkPlus

win版OfficeSuite Premium(办公套件) v8.81简体中文版

iMac小白

win版Serato Studio(独立音乐制作软件) v2.3.0 (x64)特别版

iMac小白

win版n-Track Studio Suite(音频录制和编辑软件) v10.1特别版

iMac小白

网络安全作业三

白开水又一杯

客户在哪儿AI与其他服务于B端的科技产品有何不同

客户在哪儿AI

人工智能 ToB营销 ToB增长 大客户营销

XR实时云渲染-加速虚拟仿真云教学呈现!

3DCAT实时渲染

云渲染 虚拟仿真 实时云渲染 虚拟仿真云教学

win版VMware InstallBuilder Enterprise(安装包制作) v24.7.0 特别版

iMac小白

企业级im即时通讯可以给企业解决什么问题?

WorkPlus

基于Java+SpringBoot+Vue桂林旅游景点导游平台设计和实现

hunter_coder

后端开发

win版4K YouTube to MP3(在线视频音频提取工具) v5.5.0特别版

iMac小白

基于Java+SpringBoot+Vue多媒体素材管理系统设计和实现

hunter_coder

后端开发

基于Java+SpringBoot+Vue教学资源库设计和实现

hunter_coder

后端开发

基于Java+SpringBoot+Vue服装生产管理设计和实现

hunter_coder

后端开发

运维防背锅的办法之一:命令审计

蝉翼2u

程序员 运维 安全 开发 审计

携程景点美食数据采集接口:连接用户与目的地的桥梁

tbapi

携程API 携程景点数据采集 携程美食数据采集 携程景点API 携程美食API

win版Athentech Perfectly Clear Video (AI视频清晰化处理软件) v4.6.1特别版

iMac小白

win版Postbox(邮箱管理工具) v7.0.61 激活版

iMac小白

win版Perfectly Clear Workbench(图片编辑软件) v4.6.1特别版

iMac小白

IM即时通讯软件,企业即时通讯系统—WorkPlus

WorkPlus

企业im是什么?

WorkPlus

基于业务规则拆分用户故事——避免工作局促

Bruce Talk

敏捷开发 Agile User Story

基于Java+SpringBoot+Vue健身俱乐部管理系统设计和实现

hunter_coder

后端开发

基于Java+SpringBoot+Vue狗粮销售商城系统设计和实现

hunter_coder

后端开发

Agora Flutter SDK:一套代码,实现双端通话(三)_文化 & 方法_声网_InfoQ精选文章