• Android中二维码的扫描与生成(zxing库)


    目录

    一.zxing是什么?

    二.集成zxing框架

             三.界面设计

    四.二维码生成

    五.二维码扫描


    一.zxing是什么?

    zxing是google推出的一个开源的二维码框架,可以实现使用手机的摄像头完成二维码的扫描和解码

    二.集成zxing框架

    1. 将获取的jar包复制到工程的app/libs目录下,刷新,然后去添加依赖

    2. 集成java源码,将demo工程QrScan中app/src/main/java/目录下包中的zxing和util复制到此工程对应的app/src/main/java的包下

    3. 修改package包名,修改import路径,修改类包名

    4. 同步资源,复制资源目录

    drawable:btn_back.png    flash_off.png    flash_on.png

    layout:复制activity_capture.xml,activity_scanner.xml,toolbar_scanner.xml

    raw:全部复制

    values:复制 / 替换其中的attrs.xml,ids.xml,colors.xml

    5.修改工具栏框架包和ViewFinderView包路径

    6.打开开发权限,在清单文件中添加开发权限

    1. "android.permission.CAMERA" />
    2. "android.permission.VIBRATE" />
    3. "android.permission.READ_EXTERNAL_STORAGE" />

    7.最后运行一下工程,如果没报错的话就成功了

    三.界面设计

    activity_main.xml代码如下:

    1. android:layout_width="match_parent"
    2. android:layout_height="wrap_content"
    3. android:theme="@style/AppTheme.AppBarOverlay">
    4. android:id="@+id/toolbar"
    5. android:layout_width="match_parent"
    6. android:layout_height="?attr/actionBarSize"
    7. android:background="?attr/colorPrimary"
    8. app:popupTheme="@style/AppTheme.PopupOverlay" />
    9. "@layout/content_main" />
    10. android:id="@+id/fab"
    11. android:layout_width="wrap_content"
    12. android:layout_height="wrap_content"
    13. android:layout_gravity="bottom|end"
    14. app:srcCompat="@android:drawable/ic_dialog_email" />

    content.xml代码如下:

    1. android:id="@+id/myTextView"
    2. android:layout_width="0dp"
    3. android:layout_height="wrap_content"
    4. android:layout_marginTop="48dp"
    5. android:hint="扫描结果"
    6. android:textSize="24sp"
    7. app:layout_constraintBottom_toBottomOf="parent"
    8. app:layout_constraintEnd_toEndOf="parent"
    9. app:layout_constraintHorizontal_bias="0.0"
    10. app:layout_constraintStart_toStartOf="parent"
    11. app:layout_constraintTop_toBottomOf="@+id/myScanButton"
    12. app:layout_constraintVertical_bias="0.0" />
    13. android:id="@+id/myEditText"
    14. android:layout_width="0dp"
    15. android:layout_height="wrap_content"
    16. android:layout_marginTop="16dp"
    17. android:ems="10"
    18. android:hint="输入要生成二维码的字符"
    19. android:inputType="textPersonName"
    20. app:layout_constraintEnd_toEndOf="parent"
    21. app:layout_constraintHorizontal_bias="0.0"
    22. app:layout_constraintStart_toStartOf="parent"
    23. app:layout_constraintTop_toTopOf="parent" />
    24. android:id="@+id/myCreateButton"
    25. android:layout_width="0dp"
    26. android:layout_height="wrap_content"
    27. android:text="开始生成"
    28. android:textSize="18sp"
    29. app:layout_constraintEnd_toEndOf="parent"
    30. app:layout_constraintStart_toStartOf="parent"
    31. app:layout_constraintTop_toBottomOf="@+id/myEditText" />
    32. android:id="@+id/myImageView"
    33. android:layout_width="202dp"
    34. android:layout_height="196dp"
    35. android:layout_marginTop="64dp"
    36. app:layout_constraintEnd_toEndOf="parent"
    37. app:layout_constraintHorizontal_bias="0.497"
    38. app:layout_constraintStart_toStartOf="parent"
    39. app:layout_constraintTop_toBottomOf="@+id/myCreateButton"
    40. app:srcCompat="@android:drawable/screen_background_light_transparent" />
    41. android:id="@+id/myScanButton"
    42. android:layout_width="0dp"
    43. android:layout_height="wrap_content"
    44. android:layout_marginTop="36dp"
    45. android:text="开始扫描"
    46. android:textSize="18sp"
    47. app:layout_constraintEnd_toEndOf="parent"
    48. app:layout_constraintHorizontal_bias="0.0"
    49. app:layout_constraintStart_toStartOf="parent"
    50. app:layout_constraintTop_toBottomOf="@+id/myImageView" />

    四.二维码生成

    创建类CreateUtil,并编写createQRCode()方法来实现

    1. public class CreateUtil {
    2. //String codestring:要生成二维码的字符串
    3. // int width:二维码图片的宽度
    4. // int height:二维码图片的高度
    5. public static Bitmap createQRCode(String codestring,int width,int height){
    6. try {
    7. //首先判断参数的合法性,要求字符串内容不能为空或图片长宽必须大于0
    8. if (TextUtils.isEmpty(codestring)||width<=0||height<=0){
    9. return null;
    10. }
    11. //设置二维码的相关参数,生成BitMatrix(位矩阵)对象
    12. Hashtable hashtable=new Hashtable<>();
    13. hashtable.put(EncodeHintType.CHARACTER_SET,"utf-8"); //设置字符转码格式
    14. hashtable.put(EncodeHintType.ERROR_CORRECTION,"H"); //设置容错级别
    15. hashtable.put(EncodeHintType.MARGIN,"2"); //设置空白边距
    16. //encode需要抛出和处理异常
    17. BitMatrix bitMatrix=new QRCodeWriter().encode(codestring, BarcodeFormat.QR_CODE,width,height,hashtable);
    18. //再创建像素数组,并根据位矩阵为数组元素赋颜色值
    19. int[] pixel=new int[width*width];
    20. for (int h=0;h
    21. for (int w=0;w
    22. if (bitMatrix.get(w,h)){
    23. pixel[h*width+w]= Color.BLACK; //设置黑色色块
    24. }else{
    25. pixel[h*width+w]=Color.WHITE; //设置白色色块
    26. }
    27. }
    28. }
    29. //创建bitmap对象
    30. //根据像素数组设置Bitmap每个像素点的颜色值,之后返回Bitmap对象
    31. Bitmap qrcodemap=Bitmap.createBitmap(width,height,Bitmap.Config.ARGB_8888);
    32. qrcodemap.setPixels(pixel,0,width,0,0,width,height);
    33. return qrcodemap;
    34. }catch (WriterException e){
    35. return null;
    36. }
    37. }
    38. }

    在MainActivity中编写代码——生成二维码

    1. //点击开始生成按钮监听事件
    2. startBt1.setOnClickListener(new View.OnClickListener() {
    3. @Override
    4. public void onClick(View v) {
    5. String input=inputEt.getText().toString(); //获取用户输入的字符串
    6. //调用CreateUtil类生成二维码后显示在界面上
    7. contentIv.setImageBitmap(CreateUtil.createQRCode(input,contentIv.getWidth(),contentIv.getHeight()));
    8. }
    9. });

    五.二维码扫描

    MainActivity中编写代码

    1. //开始扫描按钮点击事件监听
    2. startBt2.setOnClickListener(new View.OnClickListener() {
    3. @Override
    4. public void onClick(View v) {
    5. scanQRCode();
    6. }
    7. });
    8. //实现扫描二维码的方法
    9. private void scanQRCode() {
    10. //申请相机权限
    11. if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
    12. ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, Constant.REQ_PERM_CAMERA);
    13. return;
    14. }
    15. //申请文件(相册)读写权限
    16. if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
    17. ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, Constant.REQ_PERM_EXTERNAL_STORAGE);
    18. return;
    19. }
    20. //二维码扫码
    21. //然后通过Intent机制启动zxing框架的CaptureActivity,请求返回结果
    22. Intent intent = new Intent(this, CaptureActivity.class);
    23. startActivityForResult(intent, Constant.REQ_QR_CODE);
    24. }
    25. @Override
    26. protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    27. super.onActivityResult(requestCode, resultCode, data);
    28. //扫描结果回调
    29. if (requestCode == Constant.REQ_QR_CODE && resultCode == RESULT_OK) {
    30. Bundle bundle = data.getExtras();
    31. String scanResult = bundle.getString(Constant.INTENT_EXTRA_KEY_QR_SCAN);
    32. //将扫描出的信息显示出来
    33. resultTv.setText(scanResult);
    34. }
    35. }
    36. @Override
    37. public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    38. super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    39. switch (requestCode){
    40. case Constant.REQ_PERM_CAMERA:
    41. //摄像头权限申请
    42. if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
    43. //获得授权
    44. scanQRCode();
    45. } else {
    46. //被禁止授权
    47. Toast.makeText(this, "请至权限中心打开本应用的相机访问权限", Toast.LENGTH_LONG).show();
    48. }
    49. break;
    50. case Constant.REQ_PERM_EXTERNAL_STORAGE:
    51. //文件读写权限申请
    52. if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
    53. //获得授权
    54. scanQRCode();
    55. } else {
    56. //被禁止授权
    57. Toast.makeText(this, "请至权限中心打开本应用的文件读写权限", Toast.LENGTH_LONG).show();
    58. }
    59. break;
    60. }
    61. }
    62. }

    到此,一个简易的二维码生成与扫描就完成了

     

  • 相关阅读:
    动手学习深度学习08----线性模型+基础优化算法
    找不到工作,软件测试真的不香了?
    MySQL 5.7.x--命令行自带帮助文档的使用,超级棒!!!
    Spring Cloud Sleuth 和 Zipkin 进行分布式跟踪使用指南
    element-plus 设置 el-date-picker 弹出框位置
    这才是数字孪生污水处理厂该有的样子 | 智慧水务
    postman自动化运行接口测试用例
    pytorch 多卡分布式训练 调用all_gather_object 出现阻塞等待死锁的问题
    训练营第二十九天贪心(简单题目)
    C# Onnx Yolov8 Detect 水果识别
  • 原文地址:https://blog.csdn.net/Ai1114/article/details/125915688