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(){

? ? //頁面可見時才執(zhí)行

? ? 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;

? ? }

? }

}

參考:鏈接

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi閱讀 7,424評論 0 10
  • 小序:昨天是西方的愚人節(jié)。關于愚人節(jié)的來歷有多種說法,取其中的兩種命意。 傳說極樂園里開滿水仙 主宰之神雪麗絲的女...
    邱繼祥閱讀 357評論 0 1
  • 我發(fā)現! 用g++編譯運行的時候,如果你的程序中數組越界了,竟然還能順利通過,不會報錯或中斷。你以為你的代碼是對的...
    愛秋刀魚的貓閱讀 246評論 0 0
  • Velocity.js UI(下載地址) 是一套很優(yōu)秀的動畫預設插件,主要分為 callout 和 transit...
    KimYYX閱讀 2,885評論 2 1
  • 黑夜里的天空 天上掛滿了星星 山上的茅屋里 只有一個老爺爺 還有一條大黃狗 老爺爺的孩子們 都走了 身處遲暮的老爺...
    陌上紅塵_62af閱讀 2,590評論 22 64