Android studio 二维码使用

Android 解析二维码/条形码,推荐使用 BGAQRCode-Android

二维码已经有很多人写过了,这里写一篇一维码/条形码的博客,

 

 导入方法如下:

implementation 'cn.bingoogolapple:bga-qrcode-zbar:1.3.7'
或者
implementation 'cn.bingoogolapple:bga-qrcode-zxing:1.3.7'

 本来没有什么好说的,可是竟然花费了我一天的时间,这里就顺手写一下zbar跟zxing的区别吧

就使用摄像头读取而言:

目录

Android 解析二维码/条形码,推荐使用 BGAQRCode-Android

一开始用的是原始的zxing,

最后使用了 BGAQRCode-Android 的zbar

附录:flutter 调用二维码 


 


一开始用的是原始的zxing,

//implementation 'com.google.zxing:core:3.4.1'//Older SDK versions 这里不用

    implementation 'com.journeyapps:zxing-android-embedded:4.1.0'
    implementation 'androidx.appcompat:appcompat:1.0.2'

先设置 xml:

<uses-sdk tools:overrideLibrary="com.google.zxing.client.android" />

由于调用了加速硬件,所以还要加上一句

  <application android:hardwareAccelerated="true" ... >

调用也比较简单:

new IntentIntegrator(this).initiateScan(); // `this` is the current Activity


// Get the results:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
    if(result != null) {
        if(result.getContents() == null) {
            Toast.makeText(this, "Cancelled", Toast.LENGTH_LONG).show();
        } else {
            Toast.makeText(this, "Scanned: " + result.getContents(), Toast.LENGTH_LONG).show();
        }
    } else {
        super.onActivityResult(requestCode, resultCode, data);
    }
}

如果是fragment,则可以使用 

IntentIntegrator.forFragment(this).initiateScan(); // `this` is the current Fragment

// If you're using the support library, use IntentIntegrator.forSupportFragment(this) instead.
//自定义

IntentIntegrator integrator = new IntentIntegrator(this);
integrator.setDesiredBarcodeFormats(IntentIntegrator.ONE_D_CODE_TYPES);
integrator.setPrompt("Scan a barcode");
integrator.setCameraId(0);  // Use a specific camera of the device
integrator.setBeepEnabled(false);
integrator.setBarcodeImageEnabled(true);
integrator.initiateScan();

 本来使用读取就可以,但是这个zxing非常原始,需要跳转到Activity再跳转回来,且不能在布局里自定义

由于无法识别红底黑线的一维码,zxing对颜色感应比较差,特别是贴了透明膜带反光效果的物体基本识别不出来,就摄像头读取而言,不得不改使用zbar

测试可以网站生成红底/绿底的条形码进行测试:在线条形码生成传送门 https://barcode.tec-it.com/zh/?data=12345678901256

 

最后使用了 BGAQRCode-Android 的zbar

implementation 'cn.bingoogolapple:bga-qrcode-zbar:1.3.7'

 

如果只是读取条形码,需要添加

app:qrcv_isBarcode="true"

布局文件如下: 

 <cn.bingoogolapple.qrcode.zbar.ZBarView
        android:id="@+id/zxingview" 
        app:qrcv_animTime="500"
        app:qrcv_isBarcode="true"
        app:qrcv_isScanLineReverse="true"
        app:qrcv_borderColor="@android:color/white"
        app:qrcv_borderSize="1dp"
        app:qrcv_cornerColor="@android:color/transparent"
        app:qrcv_cornerLength="20dp"
        app:qrcv_cornerSize="3dp"
        app:qrcv_maskColor="#33FFFFFF"
        app:qrcv_rectWidth="300dp"
        app:qrcv_scanLineColor="@color/design_default_color_secondary"
        app:qrcv_scanLineSize="1dp"
        app:qrcv_topOffset="90dp"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content" />

 调用也很简单

QRCodeView mQRCodeView = (ZBarView) findViewById(R.id.zbarview);
mQRCodeView.setDelegate(this);


@Override
  public void onScanQRCodeSuccess(String result) {
     
    Toast.makeText(this,result,Toast.LENGTH_SHORT).show();
    mQRCodeView.startSpot();
  }

  @Override
  public void onScanQRCodeOpenCameraError() {
    Toast.makeText(this,"错误",Toast.LENGTH_SHORT).show();
  }

 烦人的生命周期

@Override
  protected void onStart() {
    super.onStart();
    mQRCodeView.startCamera();//打开相机
    mQRCodeView.showScanRect();//显示扫描框
    mQRCodeView.startSpot();//开始识别二维码
    //mQRCodeView.openFlashlight();//开灯
    //mQRCodeView.closeFlashlight();//关灯
  }

  @Override
  protected void onStop() {
    mQRCodeView.stopCamera();
    super.onStop();
  }

  @Override
  protected void onDestroy() {
    mQRCodeView.onDestroy();
    super.onDestroy();
  }

  

 好了,如果使用zxing去调用摄像头,则会一直弹出log

           com.google.zxing.NotFoundException 

原因是:摄像头一直在搜索二维码,但是搜索不到

而且,对颜色依然是感应比较差,速度比zbar慢了3-5倍

最后总结了一下:Zbar适合摄像头读取,zxing适合生成二维码/条形码

其他的都可以去搜索,就到这了,因为是一维码/条形码,就不涉及读取二维码精度的问题了

 

 

附录:flutter 调用二维码 

 

dependencies:
  qr_code_scanner: ^0.3.5

附上代码

import 'dart:io';

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:qr_code_scanner/qr_code_scanner.dart';

void main() => runApp(MaterialApp(home: QRViewExample()));

class QRViewExample extends StatefulWidget {
  const QRViewExample({
    Key key,
  }) : super(key: key);

  @override
  State<StatefulWidget> createState() => _QRViewExampleState();
}

class _QRViewExampleState extends State<QRViewExample> {
  Barcode result;
  QRViewController controller;
  final GlobalKey qrKey = GlobalKey(debugLabel: 'QR');

  // In order to get hot reload to work we need to pause the camera if the platform
  // is android, or resume the camera if the platform is iOS.
  @override
  void reassemble() {
    super.reassemble();
    if (Platform.isAndroid) {
      controller.pauseCamera();
    }
    controller.resumeCamera();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(
        children: <Widget>[
          Expanded(flex: 4, child: _buildQrView(context)),
          Expanded(
            flex: 1,
            child: FittedBox(
              fit: BoxFit.contain,
              child: Column(
                mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                children: <Widget>[
                  if (result != null)
                    Text(
                        'Barcode Type: ${describeEnum(result.format)}   Data: ${result.code}')
                  else
                    Text('Scan a code'),
                  Row(
                    mainAxisAlignment: MainAxisAlignment.center,
                    crossAxisAlignment: CrossAxisAlignment.center,
                    children: <Widget>[
                      Container(
                        margin: EdgeInsets.all(8),
                        child: ElevatedButton(
                            onPressed: () async {
                              await controller?.toggleFlash();
                              setState(() {});
                            },
                            child: FutureBuilder(
                              future: controller?.getFlashStatus(),
                              builder: (context, snapshot) {
                                return Text('Flash: ${snapshot.data}');
                              },
                            )),
                      ),
                      Container(
                        margin: EdgeInsets.all(8),
                        child: ElevatedButton(
                            onPressed: () async {
                              await controller?.flipCamera();
                              setState(() {});
                            },
                            child: FutureBuilder(
                              future: controller?.getCameraInfo(),
                              builder: (context, snapshot) {
                                if (snapshot.data != null) {
                                  return Text(
                                      'Camera facing ${describeEnum(snapshot.data)}');
                                } else {
                                  return Text('loading');
                                }
                              },
                            )),
                      )
                    ],
                  ),
                  Row(
                    mainAxisAlignment: MainAxisAlignment.center,
                    crossAxisAlignment: CrossAxisAlignment.center,
                    children: <Widget>[
                      Container(
                        margin: EdgeInsets.all(8),
                        child: ElevatedButton(
                          onPressed: () async {
                            await controller?.pauseCamera();
                          },
                          child: Text('pause', style: TextStyle(fontSize: 20)),
                        ),
                      ),
                      Container(
                        margin: EdgeInsets.all(8),
                        child: ElevatedButton(
                          onPressed: () async {
                            await controller?.resumeCamera();
                          },
                          child: Text('resume', style: TextStyle(fontSize: 20)),
                        ),
                      )
                    ],
                  ),
                ],
              ),
            ),
          )
        ],
      ),
    );
  }

  Widget _buildQrView(BuildContext context) {
    // For this example we check how width or tall the device is and change the scanArea and overlay accordingly.
    var scanArea = (MediaQuery.of(context).size.width < 400 ||
            MediaQuery.of(context).size.height < 400)
        ? 150.0
        : 300.0;
    // To ensure the Scanner view is properly sizes after rotation
    // we need to listen for Flutter SizeChanged notification and update controller
    return QRView(
      key: qrKey,
      onQRViewCreated: _onQRViewCreated,
      overlay: QrScannerOverlayShape(
          borderColor: Colors.red,
          borderRadius: 10,
          borderLength: 30,
          borderWidth: 10,
          cutOutSize: scanArea),
    );
  }

  void _onQRViewCreated(QRViewController controller) {
    setState(() {
      this.controller = controller;
    });
    controller.scannedDataStream.listen((scanData) {
      setState(() {
        result = scanData;
      });
    });
  }

  @override
  void dispose() {
    controller?.dispose();
    super.dispose();
  }
}

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
你可以使用 Android Studio 中的 Barcode API 来生成二维码。以下是一个简单的示例代码: 1. 首先,确保你的项目中已经添加了以下依赖项: ``` implementation 'com.google.zxing:core:3.3.0' implementation 'com.journeyapps:zxing-android-embedded:3.0.3' ``` 2. 在你的布局文件中添加一个 ImageView: ```xml <ImageView android:id="@+id/imageView" android:layout_width="wrap_content" android:layout_height="wrap_content" /> ``` 3. 在你的活动或片段中,使用以下代码生成并显示二维码: ```java import android.graphics.Bitmap; import android.os.Bundle; import android.widget.ImageView; import androidx.appcompat.app.AppCompatActivity; import com.google.zxing.BarcodeFormat; import com.google.zxing.MultiFormatWriter; import com.google.zxing.WriterException; import com.google.zxing.common.BitMatrix; import com.journeyapps.barcodescanner.BarcodeEncoder; public class MainActivity extends AppCompatActivity { private ImageView imageView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); imageView = findViewById(R.id.imageView); String text = "Hello, World!"; // 要生成二维码的文本 // 使用 MultiFormatWriter 来生成 BitMatrix 对象 MultiFormatWriter multiFormatWriter = new MultiFormatWriter(); try { BitMatrix bitMatrix = multiFormatWriter.encode(text, BarcodeFormat.QR_CODE, 250, 250); BarcodeEncoder barcodeEncoder = new BarcodeEncoder(); Bitmap bitmap = barcodeEncoder.createBitmap(bitMatrix); imageView.setImageBitmap(bitmap); } catch (WriterException e) { e.printStackTrace(); } } } ``` 这段代码将会在 ImageView 中显示出一个包含 "Hello, World!" 文本的二维码。你可以将 `text` 变量替换为你想要的任何文本。 希望这能帮到你!如果你有任何其他问题,请随时问我。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值