uniapp 用户拒绝授权再次调起授权-语音识别、微信地址、微信附近地址

小程序重构,采用 uniapp 框架。记录一下踩过的坑。关于用户拒绝再次调起授权,及如何识别语音识别、微信地址、附近地址的处理。

语音识别 组件

  • 语音识别,小程序只有录音功能,若要识别录音文件,常规做法是把录音文件传递给后端,然后由后端调用百度或讯飞语音识别接口,然后返回结果。
  • 但是微信小程序官方提供了“同声传译”插件,支持前端直接识别。可参考:插件介绍插件使用文档
  • uniapp 插件配置,在 manifest.json 文件中,源码模式,加入:
...
"mp-weixin": {
    ...
    "plugins" : {
        // 语音识别 - 同声传译
        "WechatSI" : {  
            "version" : "0.3.1",  
            "provider" : "wx069ba97219f66d99"  
        }  
    }
}
  • 调用
<template>
    <view @click="asrStart">语音识别</view>
    
    <view>{{arsRes}}</view>
    
    <!-- 语音识别 -->
    <wechat-asr ref="weixinAsr" @callback="asrResult"/>
</template>

<script>
import WechatAsr from '@/components/wechatASR.vue';

export default {
    components: {WechatAsr},
    data () {
        return {
            arsRes: ''
        }
    },
    methods: {
      // 语音识别
      asrStart () {
        this.$refs.weixinAsr.show();
      },
      asrResult (res) {
        this.arsRes = res;
      }
    }
}
</script>

  • 编写组件,其中关于授权,用户若拒绝了,再次点击,本来是会一直进入失败的回调中,导致没法再次打开授权界面。所以先获取授权信息,针对没有授权、授权拒绝、授权成功,分别再次处理。若授权拒绝,需要打开授权设置界面,让用户再次授权处理。
<template>
  <!-- 微信语音识别 -->
  <view class="mask" v-show="isShow">
    <view class="weixin-asr">
      <view class="title">语音识别</view>
      <!-- 动画 -->
      <view class="spinner">
        <view class="rect rect1"></view>
        <view class="rect rect2"></view>
        <view class="rect rect3"></view>
        <view class="rect rect4"></view>
        <view class="rect rect5"></view>
      </view>
      <view class="tip">说出姓名、电话和详细地址</view>
      <button class="btn" type="default" @click="recordStop">说完了</button>
    </view>
  </view>
</template>

<script>
  const WechatSI = requirePlugin("WechatSI");
  const ASRManager = WechatSI.getRecordRecognitionManager();
  
  export default {
    data () {
      return {
        isShow: false
      }
    },
    onReady () {
      // 录音开启成功回调
      ASRManager.onStart = function (res) {
        _this.isShow = true;
      }
      
      const _this = this;
      // 识别错误事件  
      ASRManager.onError = (res) => {
        _this.isShow = false;
        console.log(res.msg);
      }
      
      // 录音停止回调
      ASRManager.onStop = function (res) {        
        if (res && res.result) {
          _this.$emit('callback', res.result);
        } else {
          uni.showToast({
            icon: 'none',
            title: '抱歉,没听到您的声音哦'
          })
        }
      }
    },
    methods: {
      data () {
        return {
          isShow: false,
        }
      },
      show () {
        const _this = this;
        // 获取是否授权信息
        uni.getSetting({
          success(res) {
            if (res && res.authSetting && res.authSetting.hasOwnProperty('scope.record')) {
              if (res.authSetting['scope.record']) {
                start();
              } else { // 拒绝授权,打开授权设置
                uni.openSetting({
                  success() {
                    start();
                  }
                })
              }
            } else {
              start();
            }
          }
        })
        
        function start () {
          ASRManager.start({
            lang: "zh_CN"
          });
        }
      },
      // 录音停止
      recordStop () {
        this.isShow = false;
        ASRManager.stop();
      }
    }
  }
</script>

<style lang="scss" scoped>
  .mask {
    position: fixed;
    top: 0;
    left: 0;
    z-index: 300;
    width: 100%;
    height: 100%;
    background: rgba(0, 0, 0, .54);
  }
  .weixin-asr {
    position: absolute;
    top: calc(50% - #{477upx / 2});
    left: 0;
    right: 0;
    margin: 0 auto;
    width: 560upx;
    height: 477upx;
    background: #fff;
    text-align: center;
    transform: .5s ease-out .5s;
    .title {
      margin-top: 42upx;
      color: #000;
      font-size: 34upx;
      font-weight: 500;
    }
    .spinner {
      margin: 50upx;
      height: 100upx;
    }
    .tip {
      color: #787878;
    }
    .btn {
      margin-top: 28upx;
      width: 225upx;
      height: 82upx;
      background: $theme1;
      color: #fff;
      font-size: 34upx;
      line-height: 82upx;
      border-radius: 82upx;
    }
  }
  
  .spinner {
    text-align: center;
  }
   
  .spinner > .rect {
    background-color: #EDAA35;
    height: 100%;
    border-radius: 13upx;
    width: 13upx;
    display: inline-block;
     
    -webkit-animation: stretchdelay 1.2s infinite ease-in-out;
    animation: stretchdelay 1.2s infinite ease-in-out;
    
    & + .rect {
      margin-left: 15upx;
    }
  }
   
  .spinner .rect2 {
    -webkit-animation-delay: -1.1s;
    animation-delay: -1.1s;
  }
   
  .spinner .rect3 {
    -webkit-animation-delay: -1.0s;
    animation-delay: -1.0s;
  }
   
  .spinner .rect4 {
    -webkit-animation-delay: -0.9s;
    animation-delay: -0.9s;
  }
   
  .spinner .rect5 {
    -webkit-animation-delay: -0.8s;
    animation-delay: -0.8s;
  }
   
  @-webkit-keyframes stretchdelay {
    0%, 40%, 100% { -webkit-transform: scaleY(0.4) } 
    20% { -webkit-transform: scaleY(1.0) }
  }
   
  @keyframes stretchdelay {
    0%, 40%, 100% {
      transform: scaleY(0.4);
      -webkit-transform: scaleY(0.4);
    }  20% {
      transform: scaleY(1.0);
      -webkit-transform: scaleY(1.0);
    }
  }
</style>

微信地址、附近地址

它们的处理,和上面逻辑一样,只是调用的 api 不一样。

逻辑也是先获取授权信息,未授权、用户拒绝授权、授权成功,在用户拒绝授权时,打开授权设置页面,没授权由小程序主动调起授权弹窗。

主要处理逻辑如下:

  • 微信地址
chooseAddress (type) {
    const _this = this;
    if (type === 'weixin') {
      // 处理拒绝再次打开调用设置
      uni.getSetting({
        success (res) {
          if (res && res.authSetting && res.authSetting.hasOwnProperty('scope.address')) {
            if (res.authSetting['scope.address']) {
              choose();
            } else {
              uni.openSetting({
                success () {
                  choose();
                }
              })
            }
          } else {
            choose();
          }
        }
      });

      function choose () {
        uni.chooseAddress({
          success(res) {
            if (res) {
               // 调用接口将省市区转换成项目需要的,带id的,然后进行后续处理
            }
          }
        })
      }
    }
}
  • 附近地址
nearAddress () {
    const _this = this;
    // 处理拒绝再次打开调用设置
    uni.getSetting({
      success (res) {
        if (res && res.authSetting && res.authSetting.hasOwnProperty('scope.userLocation')) {
          if (res.authSetting['scope.userLocation']) {
            chooseLocation();
          } else {
            uni.openSetting({
              success () {
                chooseLocation();
              }
            })
          }
        } else {
          chooseLocation();
        }
      }
    })
    
    function chooseLocation () {
      uni.chooseLocation({
        success: function (res) {
          if (res) {
            // 调用接口将省市区转换成项目需要的,带id的,然后进行后续处理
          }
        }
      });
    }
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,752评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,100评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,244评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,099评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,210评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,307评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,346评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,133评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,546评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,849评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,019评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,702评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,331评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,030评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,260评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,871评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,898评论 2 351

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,094评论 1 32
  • [宋代]赵师侠 梅花谢后樱花绽, 浅浅匀红。 试手天工。 百卉千葩一信通。 余寒未许开舒妥, 怨雨愁风。 结子筠笼...
    修源正本阅读 278评论 0 2
  • requirejs、cmd、amd基本解释
    尝了又尝阅读 175评论 0 0