ionic3 使用QR Scaner 掃描(親測(cè))

ionic 官方有提供三個(gè)掃描插件,分別為:

  1. Barcode Scanner
    速度很慢,樣式不怎樣
  2. QR Scanner
    速度快,樣式隨心所欲,直接在html里修改屬于自己的樣式
  3. ZBar
    速度快,能掃描條形碼與二維碼,這樣也導(dǎo)致如果二維碼附近有其它類似一維碼的圖案,可能會(huì)影響值的準(zhǔn)確性,還有沒有提供掃描框

綜合以上,所以最后還是決定使用QR Scaner進(jìn)行掃描。

1. 安裝插件
$ ionic cordova plugin add cordova-plugin-qrscanner
$ npm install --save @ionic-native/qr-scanner@4
2. 新建掃描頁面
$ ionic g page scan

成功后


圖片.png
3. 使用

assets/imgs
掃描框圖片做css背景
下載圖片

圖片.png

scan.html

<ion-header >
  <ion-navbar >
      <ion-title>掃描中……</ion-title>
  </ion-navbar>
</ion-header>
<ion-content no-scroll [ngClass]="{'qrscanner':isShow}" >
  <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.scss

page-scan {
.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: 50%;
    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;
    }
}
}

scan.ts

import { Component } from '@angular/core';
import { IonicPage, NavController, NavParams, ViewController } 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.
 */
@IonicPage()
@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) {
      //默認(rèn)為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();
          });

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

          // wait for user to scan something, then the observable callback will be called
        } else if (status.denied) {
          // 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 {
          // 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(){
    //頁面可見時(shí)才執(zhí)行
    this.showCamera();
    this.isShow = true;//顯示背景
  }



  /**
   * 閃光燈控制,默認(rèn)關(guān)閉
   */
  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();//需要關(guān)閉掃描,否則相機(jī)一直開著
    this.qrScanner.destroy();//關(guān)閉
  }

  ionViewWillLeave() {
    this.hideCamera();
  }
}

variables.scss

ion-app.cameraView, ion-app.cameraView ion-content, ion-app.cameraView .nav-decor {
  background: transparent none !important; 
  .tabbar.show-tabbar{
    opacity: 0;
  }
  // 隱藏所有頁面
   ion-nav, ion-tab, ion-tabs {
    opacity: 0 !important;
  }
}
最后在所需的頁面跳轉(zhuǎn)scan頁面即可
this.navCtrl.push('ScanPage');
4. 效果
1.gif
5. android版本仍黑屏問題

當(dāng)你以上設(shè)置完后,運(yùn)行在android手機(jī)上背景無法透明,依然顯示黑屏的情況,主要是ionic css的結(jié)構(gòu)被改變過,所以代碼所設(shè)置的樣式無法生效,例如安裝了cordova-plugin-crosswalk-webview無法正確顯示相機(jī)畫面。把它刪除即可

注意:以上測(cè)試版本
                            cordova-plugin-qrscanner@2.5.0
                            @ionic-native/qr-scanner@4.5.2

如有問題請(qǐng)簡(jiǎn)書留言或訪問網(wǎng)站交流 深圳網(wǎng)站建設(shè) https://www.qijianwang.net

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容