ionic 使用QRScanner实现扫一扫功能

1.安装插件

$ ionic cordova plugin add cordova-plugin-qrscanner

$ npm install --save @ionic-native/qr-scanner@4

2.新建扫描页面

$ ionic g page scan

3.代码

背景图片:下载链接

scan.html


<ion-header >

  <ion-navbar >

      <ion-title>扫描中...</ion-title>

  </ion-navbar>

</ion-header>

<ion-content padding style="background: none transparent;">

  <div [ngClass]="{'qrscanner-area':isShow}">   

  </div>

  <div  [ngClass]="{'through-line':isShow}"></div>

  <div class="button-bottom">

      <button (click)="toggleLight()" ion-fab class="icon-camera" margin-right>

          <ion-icon name="flash"></ion-icon>                 

      </button>

      <button (click)="toggleCamera()" ion-fab class="icon-camera">

          <ion-icon name="reverse-camera"></ion-icon>                 

      </button>

  </div>   

</ion-content>


scan.ts


import { Component } from '@angular/core';

import { NavController, NavParams, ViewController, ToastController } from 'ionic-angular';

import { QRScanner, QRScannerStatus } from '@ionic-native/qr-scanner';

/**

* Generated class for the ScanPage page.

*

* See https://ionicframework.com/docs/components/#navigation for more info on

* Ionic pages and navigation.

*/

@Component({

  selector: 'page-scan',

  templateUrl: 'scan.html',

})

export class ScanPage {

  light: boolean;//判断闪光灯

  frontCamera: boolean;//判断摄像头

  isShow: boolean = false;//控制显示背景,避免切换页面卡顿

  constructor(

    private navCtrl: NavController,

    private navParams: NavParams,

    private qrScanner: QRScanner,

    private viewCtrl: ViewController,

    private toastCtrl: ToastController) {

      //默认为false

      this.light = false;

      this.frontCamera = false;

  }

  ionViewDidLoad() {

    this.qrScanner.prepare()

      .then((status: QRScannerStatus) => {

        if (status.authorized) {

          // camera permission was granted

          // start scanning

          let scanSub = this.qrScanner.scan().subscribe((text: string) => {

            alert(text);

            this.qrScanner.hide(); // hide camera preview

            scanSub.unsubscribe(); // stop scanning

            this.navCtrl.pop();

          });

          this.qrScanner.resumePreview();

          // show camera preview

          this.qrScanner.show()

          .then((data : QRScannerStatus)=> {

            // alert(data.showing);

          },err => {

            this.showToast('bottom', err);

          });

          // wait for user to scan something, then the observable callback will be called

        } else if (status.denied) {

          this.showToast('bottom', "扫描出错");

          // camera permission was permanently denied

          // you must use QRScanner.openSettings() method to guide the user to the settings page

          // then they can grant the permission from there

        } else {

          this.showToast('bottom', "未获得相机权限");

          // permission was denied, but not permanently. You can ask for permission again at a later time.

        }

      })

      .catch((e: any) => console.log('Error is', e));

  }

  ionViewDidEnter(){

    //页面可见时才执行

    this.showCamera();

    this.isShow = true;//显示背景

  }

  /**

  * 闪光灯控制,默认关闭

  */

  toggleLight() {

    if (this.light) {

      this.qrScanner.disableLight();

    } else {

      this.qrScanner.enableLight();

    }

    this.light = !this.light;

  }

  /**

  * 前后摄像头互换

  */

  toggleCamera() {

    if (this.frontCamera) {

      this.qrScanner.useBackCamera();

    } else {

      this.qrScanner.useFrontCamera();

    }

    this.frontCamera = !this.frontCamera;

  }

  showCamera() {

    (window.document.querySelector('ion-app') as HTMLElement).classList.add('cameraView');

  }

  hideCamera() {

    (window.document.querySelector('ion-app') as HTMLElement).classList.remove('cameraView');

    this.qrScanner.hide();//需要关闭扫描,否则相机一直开着

    this.qrScanner.destroy();//关闭

  }

  ionViewWillLeave() {

    this.hideCamera();

  }

  showToast(position: string, msg: string) {

    let toast = this.toastCtrl.create({

      message: msg,

      duration: 2000,

      position: position

    });

    toast.present(toast);

  }

}


scan.scss


page-scan {

  .scroll-content {

    background: transparent none;

  }

  .qrscanner {

    background: none;

    &-area {

      width: 100%;

      height: 86%;

      background: url(../../../assets/imgs/scanner.svg) no-repeat center center;

      background-size: contain;

    }

  }

  .through-line {

    left: 25%;

    width: 52%;

    height: 2px;

    background: red;

    position: absolute;

    animation: myfirst 2s linear infinite alternate;

  }

  @keyframes myfirst {

    0% {

      background: red;

      top: 30%;

    }

    25% {

      background: yellow;

      top: 35%;

    }

    50% {

      background: blue;

      top: 40%;

    }

    75% {

      background: green;

      top: 45%;

    }

    100% {

      background: red;

      top: 50%;

    }

  }

  .button-bottom {

    width: 128px;

    position: absolute;

    left: 50%;

    bottom: 80px;

    margin-left: -64px;

    .icon-camera {

      float: left;

    }

  }

}

参考:链接

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,539评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,594评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,871评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,963评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,984评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,763评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,468评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,357评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,850评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,002评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,144评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,823评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,483评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,026评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,150评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,415评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,092评论 2 355

推荐阅读更多精彩内容

  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi阅读 7,336评论 0 10
  • 小序:昨天是西方的愚人节。关于愚人节的来历有多种说法,取其中的两种命意。 传说极乐园里开满水仙 主宰之神雪丽丝的女...
    邱继祥阅读 348评论 0 1
  • 我发现! 用g++编译运行的时候,如果你的程序中数组越界了,竟然还能顺利通过,不会报错或中断。你以为你的代码是对的...
    爱秋刀鱼的猫阅读 241评论 0 0
  • Velocity.js UI(下载地址) 是一套很优秀的动画预设插件,主要分为 callout 和 transit...
    KimYYX阅读 2,865评论 2 1
  • 黑夜里的天空 天上挂满了星星 山上的茅屋里 只有一个老爷爷 还有一条大黄狗 老爷爷的孩子们 都走了 身处迟暮的老爷...
    陌上红尘_62af阅读 2,578评论 22 64