<..._android zbar">
当前位置:   article > 正文

Android 集成二维码扫描功能-zbar_android zbar

android zbar

实现效果:

实现步骤:

1.Gradle添加二维码包引用。

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

添加好后,点击右上角的“Sync Now”

2.AndroidManifest.xml 增加相关权限配置。

  1. <uses-permission android:name="android.permission.CAMERA" />
  2. <uses-permission android:name="android.permission.VIBRATE" />
  3. <uses-permission android:name="android.permission.FLASHLIGHT" />
  4. <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

3.测试Activity代码:page_qr.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent"
  6. android:layout_marginBottom="50dp"
  7. android:orientation="vertical">
  8. <cn.bingoogolapple.qrcode.zbar.ZBarView
  9. android:id="@+id/zbarview"
  10. android:layout_width="200dp"
  11. android:layout_height="200dp"
  12. android:layout_gravity="center"
  13. android:layout_marginTop="20dp"
  14. android:layout_marginBottom="40dp"
  15. app:qrcv_animTime="1000"
  16. app:qrcv_barCodeTipText="将条码放入框内,即可自动扫描"
  17. app:qrcv_barcodeRectHeight="120dp"
  18. app:qrcv_borderColor="@android:color/white"
  19. app:qrcv_borderSize="1dp"
  20. app:qrcv_cornerColor="@color/colorPrimaryDark"
  21. app:qrcv_cornerLength="20dp"
  22. app:qrcv_cornerSize="3dp"
  23. app:qrcv_isBarcode="false"
  24. app:qrcv_isOnlyDecodeScanBoxArea="false"
  25. app:qrcv_isShowDefaultGridScanLineDrawable="true"
  26. app:qrcv_isShowDefaultScanLineDrawable="true"
  27. app:qrcv_isShowLocationPoint="true"
  28. app:qrcv_isShowTipBackground="true"
  29. app:qrcv_isShowTipTextAsSingleLine="false"
  30. app:qrcv_isTipTextBelowRect="true"
  31. app:qrcv_maskColor="#33FFFFFF"
  32. app:qrcv_qrCodeTipText="扫码二维吗"
  33. app:qrcv_rectWidth="200dp"
  34. app:qrcv_scanLineColor="@color/colorPrimaryDark"
  35. app:qrcv_toolbarHeight="0dp"
  36. app:qrcv_topOffset="0dp"
  37. app:qrcv_verticalBias="-1" />
  38. <Button
  39. android:id="@+id/start_spot"
  40. android:layout_width="wrap_content"
  41. android:layout_height="wrap_content"
  42. android:layout_gravity="center"
  43. android:text="开始扫码" />
  44. <Button
  45. android:id="@+id/stop_spot"
  46. android:layout_width="wrap_content"
  47. android:layout_height="wrap_content"
  48. android:layout_gravity="center"
  49. android:text="暂停扫码" />
  50. <Button
  51. android:id="@+id/open_flashlight"
  52. android:layout_width="wrap_content"
  53. android:layout_height="wrap_content"
  54. android:layout_gravity="center"
  55. android:text="开灯" />
  56. <Button
  57. android:id="@+id/close_flashlight"
  58. android:layout_width="wrap_content"
  59. android:layout_height="wrap_content"
  60. android:layout_gravity="center"
  61. android:text="关灯" />
  62. <TextView
  63. android:id="@+id/txtText"
  64. android:layout_width="match_parent"
  65. android:layout_height="wrap_content" />
  66. </LinearLayout>

注意:顶部申明许加上 xmlns:app="http://schemas.android.com/apk/res-auto" 这是自定义控件需要申明的命名空间。

4.后置代码 Page_QR.java

  1. package com.example.rc114.ui;
  2. import android.Manifest;
  3. import android.app.AlertDialog;
  4. import android.content.DialogInterface;
  5. import android.content.Intent;
  6. import android.content.pm.PackageManager;
  7. import android.net.Uri;
  8. import android.os.Build;
  9. import android.os.Bundle;
  10. import android.os.Vibrator;
  11. import android.provider.Settings;
  12. import android.view.View;
  13. import android.widget.TextView;
  14. import android.widget.Toast;
  15. import androidx.annotation.NonNull;
  16. import androidx.appcompat.app.AppCompatActivity;
  17. import androidx.core.app.ActivityCompat;
  18. import androidx.core.content.ContextCompat;
  19. import com.example.rc114.R;
  20. import java.util.ArrayList;
  21. import java.util.List;
  22. import cn.bingoogolapple.qrcode.core.QRCodeView;
  23. import cn.bingoogolapple.qrcode.zbar.ZBarView;
  24. public class Page_QR extends AppCompatActivity {
  25. QRCodeView qrCodeView;
  26. String[] permissions = new String[]{
  27. Manifest.permission.CAMERA,
  28. Manifest.permission.VIBRATE
  29. };
  30. private final int permissionCode = 100;//权限请求码
  31. //检查权限
  32. private void checkPermission() {
  33. List<String> permissionList = new ArrayList<>();
  34. for (int i = 0; i < permissions.length; i++) {
  35. if (ContextCompat.checkSelfPermission(this, permissions[i]) != PackageManager.PERMISSION_GRANTED) {
  36. permissionList.add(permissions[i]);
  37. }
  38. }
  39. if (permissionList.size() <= 0) {
  40. //说明权限都已经通过,可以做你想做的事情去
  41. bindEvent();
  42. } else {
  43. //存在未允许的权限
  44. ActivityCompat.requestPermissions(this, permissions, permissionCode);
  45. }
  46. }
  47. @Override
  48. public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
  49. super.onRequestPermissionsResult(requestCode, permissions, grantResults);
  50. boolean haspermission = false;
  51. if (permissionCode == requestCode) {
  52. for (int i = 0; i < grantResults.length; i++) {
  53. if (grantResults[i] == -1) {
  54. haspermission = true;
  55. }
  56. }
  57. if (haspermission) {
  58. //跳转到系统设置权限页面,或者直接关闭页面,不让他继续访问
  59. permissionDialog();
  60. } else {
  61. //全部权限通过,可以进行下一步操作
  62. bindEvent();
  63. }
  64. }
  65. }
  66. AlertDialog alertDialog;
  67. //打开手动设置应用权限
  68. private void permissionDialog() {
  69. if (alertDialog == null) {
  70. alertDialog = new AlertDialog.Builder(this)
  71. .setTitle("提示信息")
  72. .setMessage("当前应用缺少必要权限,该功能暂时无法使用。如若需要,请单击【确定】按钮前往设置中心进行权限授权。")
  73. .setPositiveButton("设置", new DialogInterface.OnClickListener() {
  74. @Override
  75. public void onClick(DialogInterface dialog, int which) {
  76. cancelPermissionDialog();
  77. Uri packageURI = Uri.parse("package:" + getPackageName());
  78. Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, packageURI);
  79. startActivity(intent);
  80. }
  81. })
  82. .setNegativeButton("取消", new DialogInterface.OnClickListener() {
  83. @Override
  84. public void onClick(DialogInterface dialog, int which) {
  85. cancelPermissionDialog();
  86. }
  87. })
  88. .create();
  89. }
  90. alertDialog.show();
  91. }
  92. private void cancelPermissionDialog() {
  93. alertDialog.cancel();
  94. }
  95. @Override
  96. protected void onCreate(Bundle savedInstanceState) {
  97. super.onCreate(savedInstanceState);
  98. setContentView(R.layout.page_qr);
  99. //6.0才用动态权限
  100. if (Build.VERSION.SDK_INT >= 23) {
  101. checkPermission();
  102. } else {
  103. bindEvent();
  104. }
  105. }
  106. private void bindEvent() {
  107. qrCodeView = (ZBarView) findViewById(R.id.zbarview);
  108. qrCodeView.setDelegate(new QRCodeView.Delegate() {
  109. @Override
  110. public void onScanQRCodeSuccess(String result) {
  111. vibrate();//震动手机
  112. //扫描成功后处理事件
  113. Toast.makeText(Page_QR.this, result, Toast.LENGTH_SHORT).show();
  114. qrCodeView.startSpot();//继续扫描
  115. TextView txtText = (TextView) findViewById(R.id.txtText);
  116. txtText.setText(result);
  117. }
  118. @Override
  119. public void onCameraAmbientBrightnessChanged(boolean isDark) {
  120. // 这里是通过修改提示文案来展示环境是否过暗的状态,接入方也可以根据 isDark 的值来实现其他交互效果
  121. String tipText = qrCodeView.getScanBoxView().getTipText();
  122. String ambientBrightnessTip = "\n环境过暗,请打开闪光灯";
  123. if (isDark) {
  124. if (!tipText.contains(ambientBrightnessTip)) {
  125. qrCodeView.getScanBoxView().setTipText(tipText + ambientBrightnessTip);
  126. }
  127. } else {
  128. if (tipText.contains(ambientBrightnessTip)) {
  129. tipText = tipText.substring(0, tipText.indexOf(ambientBrightnessTip));
  130. qrCodeView.getScanBoxView().setTipText(tipText);
  131. }
  132. }
  133. }
  134. @Override
  135. public void onScanQRCodeOpenCameraError() {
  136. Toast.makeText(Page_QR.this, "错误", Toast.LENGTH_SHORT).show();
  137. }
  138. });
  139. qrCodeView.startCamera();
  140. findViewById(R.id.start_spot).setOnClickListener(new View.OnClickListener() {
  141. @Override
  142. public void onClick(View v) {
  143. onStart();
  144. Toast.makeText(Page_QR.this, "开始扫码", Toast.LENGTH_SHORT).show();
  145. }
  146. });
  147. findViewById(R.id.stop_spot).setOnClickListener(new View.OnClickListener() {
  148. @Override
  149. public void onClick(View view) {
  150. onStop();
  151. Toast.makeText(Page_QR.this, "停止扫码", Toast.LENGTH_SHORT).show();
  152. }
  153. });
  154. findViewById(R.id.open_flashlight).setOnClickListener(new View.OnClickListener() {
  155. @Override
  156. public void onClick(View view) {
  157. qrCodeView.openFlashlight();
  158. Toast.makeText(Page_QR.this, "打开闪光灯", Toast.LENGTH_SHORT).show();
  159. }
  160. });
  161. findViewById(R.id.close_flashlight).setOnClickListener(new View.OnClickListener() {
  162. @Override
  163. public void onClick(View view) {
  164. qrCodeView.closeFlashlight();
  165. Toast.makeText(Page_QR.this, "关闭闪光灯", Toast.LENGTH_SHORT).show();
  166. }
  167. });
  168. }
  169. @Override
  170. protected void onStart() {
  171. super.onStart();
  172. qrCodeView.startCamera();//打开后置摄像头开始预览,但是并未开始识别
  173. qrCodeView.startSpotAndShowRect(); // 显示扫描框,并开始识别
  174. // mQRCodeView.showScanRect();//显示扫描框
  175. // mQRCodeView.startSpot();//开始识别二维码
  176. //mQRCodeView.openFlashlight();//开灯
  177. //mQRCodeView.closeFlashlight();//关灯
  178. }
  179. @Override
  180. protected void onStop() {
  181. qrCodeView.stopCamera();// 关闭摄像头预览,并且隐藏扫描框
  182. super.onStop();
  183. }
  184. @Override
  185. protected void onDestroy() {
  186. qrCodeView.onDestroy();
  187. super.onDestroy();
  188. }
  189. private void vibrate() {
  190. Vibrator vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
  191. vibrator.vibrate(200);
  192. }
  193. }

参考:Android二维码扫描——BGAQRCode-Android - 简书

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/爱喝兽奶帝天荒/article/detail/949514
推荐阅读
相关标签
  

闽ICP备14008679号