h5+ 掃描二維碼功能菲宴、授權(quán)

注: 我在 Android 上測(cè)試成功完成魂贬,ios沒有測(cè)試。

1. 創(chuàng)建 Barcode 掃碼控件裙顽,在 beforeRouteEnter 進(jìn)入頁面的時(shí)候調(diào)取付燥。
2. 如果沒有相機(jī)權(quán)限,去調(diào) h5+ api愈犹,進(jìn)行授權(quán)設(shè)置键科。不同手機(jī)被調(diào)取的授權(quán)界面設(shè)置不一樣闻丑。
3. 掃碼獲取信息成功后,取消 Barcode掃碼控件勋颖,bc.cancel()嗦嗡。
4. 在 Android 手機(jī)上,不能全屏饭玲,百度了很多都不能解決侥祭,這很扯淡!。

<template>
  <div class="scanQRCode">
    <div v-if="showQRcode.showcode" class="scanQRCode-body" id="scan"></div>

    <button v-else type="button" @click="clickEvent">掃碼成功</button>
  </div>
</template>

<script>
import Vue from 'vue'
let scan = null
export default {
  data () {
    return {
      randomid: '',
      showQRcode: {
        showcode: true
      }
    }
  },

  methods: {
    clickEvent (this.randomid) {
      帶著掃碼信息茄厘,去做自己想要的操作
    },

    // 開始識(shí)別
    startScan () {
      if (!window.plus) return
      // 創(chuàng)建Barcode掃碼控件
      this.startRecognize()
      setTimeout(() => {
        scan.start()
      }, 200)
    },

    // 創(chuàng)建掃描控件對(duì)象
    startRecognize () {
      var _this = this
      if (!window.plus) return

      scan = null
      scan = new window.plus.barcode.Barcode(
        'scan',
        [window.plus.barcode.QR],
        {
          frameColor: '#f08700',
          scanbarColor: '#f08700'
        }
      )

      /**
      * 掃碼識(shí)別成功事件
      * type: ( Number ) 必選 識(shí)別到的條碼類型
      * result: ( String ) 必選 識(shí)別到的條碼數(shù)據(jù)
      */
      scan.onmarked = (type, result, file) => {
        let text = '未知: '
        switch (type) {
          case window.plus.barcode.QR:
            text = 'QR: '
            break
          case window.plus.barcode.EAN13:
            text = 'EAN13: '
            break
          case window.plus.barcode.EAN8:
            text = 'EAN8: '
            break
          default:
            text = '其他: '
            break
        }
        _this.randomid = result
        _this.showQRcode.showcode = false
        if (result !== '' || result !== null || result !== undefined) {
          _this.$nextTick(() => {
            Vue.set(_this.showQRcode, 'showcode', false)
            scan.close()
          })
        }
        console.log(text + result)
      }
    },

    camerapermissions () {
      var Build = window.plus.android.importClass('android.os.Build')
      var Manifest = window.plus.android.importClass('android.Manifest')
      var MainActivity = window.plus.android.runtimeMainActivity()
      // var context=main.getApplicationContext(); // 未用到,在此僅供參考
      var ArrPermissions = [
        Manifest.permission.READ_EXTERNAL_STORAGE,
        Manifest.permission.WRITE_EXTERNAL_STORAGE,
        Manifest.permission.CAMERA
      ]

      function PermissionCheck (permission) {
        if (Build.VERSION.SDK_INT >= 23) {
          if (MainActivity.checkSelfPermission(permission) === -1) {
            return false
          }
        }
        return true
      }

      function PermissionChecks (Arr) {
        var HasPermission = true
        for (var index in Arr) {
          var permission = Arr[index]
          // 如果此處沒有權(quán)限,則是用戶拒絕了
          if (!PermissionCheck(permission)) {
            HasPermission = false
            break
          }
        }
        return HasPermission
      }

      function PermissionRequest (Arr) {
        var REQUEST_CODE_CONTACT = 101
        if (Build.VERSION.SDK_INT >= 23) {
          MainActivity.requestPermissions(Arr, REQUEST_CODE_CONTACT)
        }
      }

      // 如果沒有權(quán)限矮冬,則申請(qǐng)
      if (!PermissionChecks(ArrPermissions)) {
        PermissionRequest(ArrPermissions)
      } else { // 如果擁有權(quán)限,那么干點(diǎn)啥吧^_^
        // .......
      }
    },

    qrcode () {
      var _this = this
      if (window.plus) {
        let _s = window.plus.navigator.checkPermission('camera')
        if (_s === 'authorized') {
          _this.startScan()
        } else if (_s === 'undetermined') {
          var msg = '請(qǐng)?jiān)趹?yīng)用權(quán)限里設(shè)置允許使用相機(jī)權(quán)限'
          window.plus.nativeUI.alert(msg, function (e) {
            if (window.plus.os.name === 'iOS') {
              window.plus.runtime.openURL('app-settings:CAMERA')
            } else {
              _this.camerapermissions()
              _this.$nextTick(() => {
                _this.$forceUpdate()
                _this.$router.replace('/mine')
              })
            }
          })
        } else {
          if (window.plus.os.name === 'iOS') {
            window.plus.runtime.openURL('app-settings:CAMERA')
          } else {
            var main = window.plus.android.runtimeMainActivity()
            var Intent = window.plus.android.importClass('android.content.Intent')
            var Build = window.plus.android.importClass('android.os.Build')
            var Uri = window.plus.android.importClass('android.net.Uri')
            var intent = new Intent()
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
            if (Build.VERSION.SDK_INT >= 9) { // 系統(tǒng)8.0以上的
              intent.setAction('android.settings.APPLICATION_DETAILS_SETTINGS')
              intent.setData(Uri.fromParts('package', main.getPackageName(), null))
            } else if (Build.VERSION.SDK_INT <= 8) { // 系統(tǒng)8.0以下的
              intent.setAction(Intent.ACTION_VIEW)
              intent.setClassName('com.android.settings', 'com.android.setting.InstalledAppDetails')
              intent.putExtra('com.android.settings.ApplicationPkgName', main.getPackageName())
            }
            main.startActivity(intent)
            _this.$nextTick(() => {
              _this.$forceUpdate()
              _this.$router.replace('/mine')
            })
          }
        }
      }
    }

  },

  beforeRouteEnter (to, from, next) {
    next((vm) => {
      // 調(diào)取二維碼掃碼
      vm.qrcode()
    })
  },

  beforeDestroy () {
    if (!window.plus) return
    scan.cancel()
    scan.close()
  }
}
</script>
掃碼控件
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末次哈,一起剝皮案震驚了整個(gè)濱河市胎署,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌窑滞,老刑警劉巖琼牧,帶你破解...
    沈念sama閱讀 219,110評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異哀卫,居然都是意外死亡巨坊,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門此改,熙熙樓的掌柜王于貴愁眉苦臉地迎上來趾撵,“玉大人,你說我怎么就攤上這事带斑」乃拢” “怎么了勋拟?”我有些...
    開封第一講書人閱讀 165,474評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵勋磕,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我敢靡,道長(zhǎng)挂滓,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,881評(píng)論 1 295
  • 正文 為了忘掉前任啸胧,我火速辦了婚禮赶站,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘纺念。我一直安慰自己贝椿,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評(píng)論 6 392
  • 文/花漫 我一把揭開白布陷谱。 她就那樣靜靜地躺著烙博,像睡著了一般瑟蜈。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上渣窜,一...
    開封第一講書人閱讀 51,698評(píng)論 1 305
  • 那天铺根,我揣著相機(jī)與錄音,去河邊找鬼乔宿。 笑死位迂,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的详瑞。 我是一名探鬼主播掂林,決...
    沈念sama閱讀 40,418評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼蛤虐!你這毒婦竟也來了党饮?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,332評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤驳庭,失蹤者是張志新(化名)和其女友劉穎刑顺,沒想到半個(gè)月后哥力,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體死讹,經(jīng)...
    沈念sama閱讀 45,796評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡咳燕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評(píng)論 3 337
  • 正文 我和宋清朗相戀三年蔼两,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了庆聘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片铜犬。...
    茶點(diǎn)故事閱讀 40,110評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡匣掸,死狀恐怖霸琴,靈堂內(nèi)的尸體忽然破棺而出播聪,到底是詐尸還是另有隱情朽基,我是刑警寧澤,帶...
    沈念sama閱讀 35,792評(píng)論 5 346
  • 正文 年R本政府宣布离陶,位于F島的核電站稼虎,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏招刨。R本人自食惡果不足惜霎俩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望沉眶。 院中可真熱鬧打却,春花似錦、人聲如沸谎倔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽片习。三九已至捌肴,卻和暖如春彤守,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背哭靖。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工具垫, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人试幽。 一個(gè)月前我還...
    沈念sama閱讀 48,348評(píng)論 3 373
  • 正文 我出身青樓筝蚕,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親铺坞。 傳聞我的和親對(duì)象是個(gè)殘疾皇子起宽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評(píng)論 2 355