dart on android,12-6【打通Flutter与Android的任督二脉】Flutter Plugin开发指南-Android端实现-2...

重点实现AsrPlugin,

需要打印log。就需要一个TAG,这里定义了一个TAG

de41965f2d9f07dbe04344015f993cfe.png

然后来添加一个方法

6de386ac90aba87570f153d4f5884363.png

在里面实例化MethodChannel和我们的Dart端进行关联,参数接收一个BinaryMessager

d393c218a33c36bcf1f3f8d8a619f7e9.png

用register.messager()获取到Message

68f011117b835d9e5a9265ca5cd0474f.png

然后来实例化Plugin。传递register

5e4dce79edea0986a09dc160174f53f4.png

构造方法,接收一个register

bfc147f546718035c8360f82e404ed21.png

重要的一步

setMethodCallHandler这样我们才能处理,来自dart端的消息。

41d074d0843886630249fb57963c633e.png

在构造方法内获取activity。要获取activity,首先要定义activity。final类型的必须要在构造函数内初始化。

da64a71452cad1589d8981ec3f26d23b.png

通过register拿到这个activity

bdba9b931482acc36887ebb3035253b2.png

重点实现onMethod

methodCall.method就是dart端调用安卓端 传过来的方法的字符串。

9adfa2c66469d8dd17bead002275e181.png

我们能提供了三个方法,开始、结束和取消。

5729330201a7b81adb0848b9704670cb.png

这里的result

38583c0b2c52011dc55847d2d07779e2.png

它有这几种返回

7ea33c81460a7ff9df4565720eb5f503.png

防止result多次调用,我们定义了一个helper类。在asr包下创建ResultStateful。也就是与状态的Result

aaa4e3d6d6e77ca5b7cd70031c5e01dc.png

实现Result的接口。

dbdd8dc791f3987129763c4d8532f923.png

重写里面的方法

0afca0d7d959e3ec30f96682d48fb470.png

再来实现构造方法

785f723fa839836308d736642b744f61.png

通过of方法来访问我们的示例

c786ba7c6a4bcc2199b4ad6e8de6e35c.png

128c9898afa98fa365b79708cd0a3398.png

7e9abddf10875ab96869e2aeadd99b1c.png

89d11f4bf18b03f8df9117eeae411503.png

0f30af9cb8f14addac19baf23685b9d9.png

2e8ffbc5b06b107f2ac0b042657d7ff8.png

修改为私有的

c5824292b88d5918e150d670d7d4e0b6.png

这样外界只能通过这个of这个方法来获取和创建这个实例

c1654c5b82838df54972342f8ac3e1b5.png

加一个TAG,因为我们要用这个TAG来打印log

415184dfd5c3813f122ac451709524f0.png

加一个成员变量,通过called来判断是够已经调用过了。

bb8474317b91df8709ae29b50d27f24a.png

如果已经调用过了,就在这里打印错误。

d54d1edd7c29ff402cdeea45202df468.png

添加一个方法来打印错误。

d3e1ef7ab90144020a7ab79175e7e7dc.png

ec7c7de646b5291f4bc8f7d81fbb2b9b.png

这样如果重复调用了。就打印error

325d5baa0e609f608bac15e547009692.png

正常嗲用的结果返回

6882c9788b6f359c3c8b3e0159b8fdcd.png

error反方也是同样的实现

2d731a1541955f24d0c663bbaca24de6.png

没有实现方法

8ec5a140c1b7e449b5fd4d4418092ed1.png

以上工具类就创建好了。接下来就可以使用它了

调用工具类

90d268f4fcb41be4fe703ab6829e5f58.png

189172991b0bb176b577de5b5678dcd3.png

c74506ecc22579204afa0fe5edc45411.png

实现start方法

d6de4cb2ae53ab86773c15db5c699246.png

38bc54a921f8639abe5c49f39e864e2f.png

首先判断activity是否为空,如果activity为空的就返回异常。

233d112c489f1f5b4a9af53de3cf3fda.png

bc7fed1bc8b02a48ef6a1b384cb76327.png

接下来获取AsrManager的实例,定义一个私有的方法,[email protected],这个返回可为空。

ec9c261a35950855e0f533f14d304387.png

在上面定义一个Asr的成员变量

45fdaf918f9909dc9a2421c2de9f48ab.png

先判断asrManager为空,然后判断activity不为空,且没有被销毁没有被关闭。

6718698d474c259994243b9ec4f9aed8.png

我们就来创建实例,第一个参数是上下文对象,我们把activity传进去。第二个参数依赖listener

4d84383deccff3f6e7b9498258daed34.png

我们来创建一个asr的listener。然后传递给上面。

d45b57cd59a464c6215584cff0e481ed.png

最终返回asrManager

e8c0793f169ed886279400d4f2c863f5.png

继续实现Start

429a2b1ce315df9ddaf6ebec3c97f4b0.png

因为我们这个start,接收的是一个Map类型。

50f34b716f8f86e0ca4ebd63df5297c8.png

所以说我们需要做一个类型转换。如果是Map类型就转换为Map类型,如果不是就传一个null

2be775c132ca138b30b1695a7f0c6c83.png

否则就打印log,并返回错误信息

d33548e76e0f77a4b5286d2bb1cc53fb.png

stop方法

5aa0e7d491f2bd92b60c6a6f35859534.png

cancel

b553137707ec28d84fb116e989a9883b.png

实现listener

listener是ai语音的识别的结果的回调。

这里并不是所有的接口都需要实现,我们只需要实现我们所需要的就可以了。

8387edf7b24b34d97ecc914ebe2bd279.png

根据需要看提示 选择自己需要实现的接口。

53adb94da49fe714299bceb295cfe037.png

这里我们重写一个最终的返回结果

ed80dc182db3fc50ca6c90eb3a863b35.png

b5a8262f2b20a282f98745a6adb919eb.png

如果发生错误,将错误的信息传递到dart端。

a607bf904e476c16f444376f0d7f33d3.png

这样我们最终实现的就是这两个方法

bf4694f1e563799c209158ab5fdec024.png

这里少了个分号

bb1b8390852f9af993fce5f026d2e9c8.png

调用stop方法和cancel

055029af38f6493a0785fbd1a085e644.png

817ed96420822736b6fb19056bf84b08.png

实现动态权限

谷歌在安卓6.0的时候,添加了动态权限,需要我们app在运行的时候,检查我们的app是否有这样的权限。

b6cedb46d9362080c7358d0cee97dba2.png

b6e14d9ed3d1f54987ac4a503c282447.png

添加一个获取动态权限的方法,把没导入的包都导入进来。

8ebc4e020ce16b7eb8be656f5263c9c5.png

这里需要传activity,所以这里把this改成当前的activity

82869cf321b39504764d8bc6c46f410f.png

1416e742c1f5d93658b6dd473c6b9916.png这里也是把 this改成activity

974bc9c63067abcb823cbecbdfa11cdc.png

这就是我们复制过来的申请权限的方法

bf31539ed91eac6ee07ccdb8c0d0ae12.png

触发这个申请权限的方法

52caa8a1aa6045977922f2e806b76238.png

在录音的时候才申请权限,也不是很好。可以在进入app的时候就申请权限。或者打开录音界面的时候去申请权限。

注册plugin-本节彩蛋

自己提供一个方法registerSelfPlugin

2b9f630b6e61e98edb01b4631a8cffeb.png

jiu

0d2074085f3722f3b450bbafcfabfd8a.png

就是我们这个plugin的包名

d66aaa818dfd3fad1e7d049b23d4ee3d.png

然后再加上类的名称

78f4030a95065635bcc35605c934ca8e.png

这就是完整的路径

96c755671bf7a13c2795dcbd1dd2f5ce.png

这样就完成了自己插件的注册,注册完成后dart端才能调用这个插件

回顾

引入了这几个类,这几个类主要来自于百度语音demo的实现。我们只是拿过来将他们改改名字,并做了相应的修改。

2e4557e087559df22b7f429386a0bf28.png

asrMananger只是实现了我们所需要的方法,

7328d417f2c4fa83b2833b05a1351255.png

对于不需要的方法我们没有实现。

c1b85ec8db5af9efc62d291b6638eb73.png

然后我们又实现了ResultStateful

b1d729b2d0b86db5d239ce028e123b89.png我们在讲MethodChannel的时候说过。MethodChannel有一次性通讯。也就是说我们dart调用native,native回调dart,它是一次性通讯。

也就是说我们dart调用native一次,native只能回调dart一次。

35f9869e213378c944d4e643e39f3763.png

如果有一种场景,用户点击了语音识别。说话的过程中,语音识别回调多次告诉我们语音识别的结果。连续的调用,这个时候我们要保证我们的程序只回调一次。这个时候就需要called这个标志位

1a07788ea458170bbafa1aebc55cfe65.png

标志位,保证逻辑的正确性

ff90c1cafcfe5a819db1c6a9c475e47e.png

我们实现了asrPlugin

这里使用了MethodChannel这个通讯机制。

3ef9e9728ffb4a351b94ccd1552c4487.png

最终想着插件开发完成后,要注册我们的插件

ff6052833b9543c55e2acafae205958f.png

结束

原文:https://www.cnblogs.com/wangjunwei/p/12311161.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值