别裁伪体亲风雅,转益多师是汝师。这篇文章主要讲述12-6打通Flutter与Android的任督二脉Flutter Plugin开发指南-Android端实现-2相关的知识,希望能为你提供帮助。
重点实现AsrPlugin,
需要打印log。就需要一个TAG,这里定义了一个TAG
文章图片
然后来添加一个方法
文章图片
在里面实例化MethodChannel和我们的Dart端进行关联,参数接收一个BinaryMessager
文章图片
用register.messager()获取到Message
文章图片
然后来实例化Plugin。传递register
文章图片
构造方法,接收一个register
文章图片
重要的一步setMethodCallHandler这样我们才能处理,来自dart端的消息。
文章图片
在构造方法内获取activity。要获取activity,首先要定义activity。final类型的必须要在构造函数内初始化。
文章图片
通过register拿到这个activity
文章图片
重点实现onMethodmethodCall.method就是dart端调用安卓端 传过来的方法的字符串。
文章图片
我们能提供了三个方法,开始、结束和取消。
文章图片
这里的result
文章图片
它有这几种返回
文章图片
防止result多次调用,我们定义了一个helper类。在asr包下创建ResultStateful。也就是与状态的Result
文章图片
实现Result的接口。
文章图片
重写里面的方法
文章图片
再来实现构造方法
文章图片
通过of方法来访问我们的示例
文章图片
文章图片
文章图片
文章图片
文章图片
文章图片
修改为私有的
文章图片
这样外界只能通过这个of这个方法来获取和创建这个实例
文章图片
加一个TAG,因为我们要用这个TAG来打印log
文章图片
加一个成员变量,通过called来判断是够已经调用过了。
文章图片
如果已经调用过了,就在这里打印错误。
文章图片
添加一个方法来打印错误。
文章图片
文章图片
这样如果重复调用了。就打印error
文章图片
正常嗲用的结果返回
文章图片
error反方也是同样的实现
文章图片
没有实现方法
文章图片
以上工具类就创建好了。接下来就可以使用它了
调用工具类
文章图片
文章图片
文章图片
实现start方法
文章图片
文章图片
首先判断activity是否为空,如果activity为空的就返回异常。
文章图片
文章图片
接下来获取AsrManager的实例,定义一个私有的方法,加一个注解@Nullable告诉调用者,这个返回可为空。
文章图片
在上面定义一个Asr的成员变量
文章图片
先判断asrManager为空,然后判断activity不为空,且没有被销毁没有被关闭。
文章图片
我们就来创建实例,第一个参数是上下文对象,我们把activity传进去。第二个参数依赖listener
文章图片
我们来创建一个asr的listener。然后传递给上面。
文章图片
最终返回asrManager
文章图片
继续实现Start【12-6打通Flutter与Android的任督二脉Flutter Plugin开发指南-Android端实现-2】
文章图片
因为我们这个start,接收的是一个Map类型。
文章图片
所以说我们需要做一个类型转换。如果是Map类型就转换为Map类型,如果不是就传一个null
文章图片
否则就打印log,并返回错误信息
文章图片
stop方法
文章图片
cancel
文章图片
实现listenerlistener是ai语音的识别的结果的回调。
这里并不是所有的接口都需要实现,我们只需要实现我们所需要的就可以了。
文章图片
根据需要看提示 选择自己需要实现的接口。
文章图片
这里我们重写一个最终的返回结果
文章图片
文章图片
如果发生错误,将错误的信息传递到dart端。
文章图片
这样我们最终实现的就是这两个方法
文章图片
这里少了个分号
文章图片
调用stop方法和cancel
文章图片
文章图片
实现动态权限谷歌在安卓6.0的时候,添加了动态权限,需要我们app在运行的时候,检查我们的app是否有这样的权限。
文章图片
文章图片
添加一个获取动态权限的方法,把没导入的包都导入进来。
文章图片
这里需要传activity,所以这里把this改成当前的activity
文章图片
文章图片
这里也是把 this改成activity
文章图片
这就是我们复制过来的申请权限的方法
文章图片
触发这个申请权限的方法
文章图片
在录音的时候才申请权限,也不是很好。可以在进入app的时候就申请权限。或者打开录音界面的时候去申请权限。
注册plugin-本节彩蛋自己提供一个方法registerSelfPlugin
文章图片
jiu
文章图片
就是我们这个plugin的包名
文章图片
然后再加上类的名称
文章图片
这就是完整的路径
文章图片
这样就完成了自己插件的注册,注册完成后dart端才能调用这个插件
回顾引入了这几个类,这几个类主要来自于百度语音demo的实现。我们只是拿过来将他们改改名字,并做了相应的修改。
文章图片
asrMananger只是实现了我们所需要的方法,
文章图片
对于不需要的方法我们没有实现。
文章图片
然后我们又实现了ResultStateful
文章图片
我们在讲MethodChannel的时候说过。MethodChannel有一次性通讯。也就是说我们dart调用native,native回调dart,它是一次性通讯。
也就是说我们dart调用native一次,native只能回调dart一次。
文章图片
如果有一种场景,用户点击了语音识别。说话的过程中,语音识别回调多次告诉我们语音识别的结果。连续的调用,这个时候我们要保证我们的程序只回调一次。这个时候就需要called这个标志位
文章图片
标志位,保证逻辑的正确性
文章图片
我们实现了asrPlugin这里使用了MethodChannel这个通讯机制。
文章图片
最终想着插件开发完成后,要注册我们的插件
文章图片
结束
推荐阅读
- “ObjectContent`1”类型未能序列化内容类型“application/xml; charset=utf-8”的响应正文。
- 如何测试网站是否支持HTTP/3()
- MongoDB,MariaDB,MySQL有什么区别(详细对比)
- 11种用于扫描Linux Server的安全缺陷和恶意软件的工具
- SQL vs. NoSQL –你的下一个项目应使用哪个()
- 如何在Ubuntu,CentOS,Debian和Windows上安装Docker()
- Kubernetes初学者简介
- 10个被称为Sysadmin的Linux工具
- 了解Kubernetes架构