ionic二维码扫描(qr-scanner在项目中的使用)

一、项目插件基本信息:

1、npm V6.9.0

2、node.js V10.16.0

3、ionic V5.2.0

4、Cordova V8.1.2 (cordova-lib@8.1.1)

5、java V1.8.0_131

6、gradle V4.10.1

二、在项目根目录执行doc,运行指令:

ionic cordova plugin add cordova-plugin-qrscanner@2.6.0

npm install @ionic-native/qr-scanner@4.15.0

三、src\app\app.module.ts 加入

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

providers: [QRScanner ]

四、src\index.html ion-app增加样式

<ion-app style="background: none transparent;"></ion-app>

五、src\theme\variables.scss 增加样式

ion-app.cameraView, ion-app.cameraView ion-content, ion-app.cameraView .nav-decor {  background: transparent none !important;   .tabbar.show-tabbar{    opacity: 0;  }}

六、src\assets\imgs 加入svg

链接: https://pan.baidu.com/s/19OcMUwadRVlvTuGYmKTQHA 提取码: 6j79 

七、src\pages加入文件夹scan

scan.html

<!--  Generated template for the ScanPage page.  See http://ionicframework.com/docs/components/#navigation for more info on  Ionic pages and navigation.--><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.module.ts

import { NgModule } from '@angular/core';import { IonicPageModule } from 'ionic-angular';import { ScanPage } from './scan';@NgModule({  declarations: [    ScanPage,  ],  imports: [    IonicPageModule.forChild(ScanPage),  ],})export class ScanPageModule {} 

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 } from 'ionic-angular';import { QRScanner, QRScannerStatus } from '@ionic-native/qr-scanner';import { DialogProvider } from '../../providers/dialog/dialog';/** * 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(public navCtrl: NavController,    public navParams: NavParams,    private qrScanner: QRScanner,    public dialog: DialogProvider, ) {    //默认为false    this.light = false;    this.frontCamera = false;  }  ionViewDidLoad() {    console.log('ionViewDidLoad ScanPage');    this.qrScanner.prepare()      .then((status: QRScannerStatus) => {        if (status.authorized) {          // camera permission was granted          // start scanning          let scanSub = this.qrScanner.scan().subscribe((text: string) => {            this.qrScanner.hide(); // hide camera preview            this.qrScanner.destroy();  // destory camera             scanSub.unsubscribe(); // stop scanning            this.navCtrl.getPrevious().data.qrScannerTxt = text;            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() {    //页面可见时才执行    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();  }}

八、我这边逻辑是扫描完返回上一页,所以在上一页的ionViewWillEnter方法中加入

  let qrScannerTxt = this.navParams.get('qrScannerTxt')|| null;    if(qrScannerTxt)

qrScannerTxt  就是二维码中的参数,我这边是存了一个url,所以解析出来是一串url地址

九、我这边生成完是用android studio调试的,AndroidManifest.xml中的权限也要注意下

<uses-permission android:name="android.permission.CAMERA" />

<uses-permission android:name="android.permission.VIBRATE" />

<uses-permission android:name="android.permission.FLASHLIGHT" />

<uses-permission android:name="android.permission.INTERNET" />

十、我这个用的是相对旧的版本了, 新的版本大家可以尝试一下,相信qr-scanner可以做得更好

官网

github

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