当前位置:   article > 正文

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

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. <!--摄像机权限-->
  2. <uses-permission android:name="android.permission.CAMERA" />
  3. <!--手机震动权限-->
  4. <uses-permission android:name="android.permission.VIBRATE" />
  5. <!--读取本地图片权限-->
  6. <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

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

三.界面设计

activity_main.xml代码如下:

  1. <com.google.android.material.appbar.AppBarLayout
  2. android:layout_width="match_parent"
  3. android:layout_height="wrap_content"
  4. android:theme="@style/AppTheme.AppBarOverlay">
  5. <androidx.appcompat.widget.Toolbar
  6. android:id="@+id/toolbar"
  7. android:layout_width="match_parent"
  8. android:layout_height="?attr/actionBarSize"
  9. android:background="?attr/colorPrimary"
  10. app:popupTheme="@style/AppTheme.PopupOverlay" />
  11. </com.google.android.material.appbar.AppBarLayout>
  12. <include layout="@layout/content_main" />
  13. <com.google.android.material.floatingactionbutton.FloatingActionButton
  14. android:id="@+id/fab"
  15. android:layout_width="wrap_content"
  16. android:layout_height="wrap_content"
  17. android:layout_gravity="bottom|end"
  18. app:srcCompat="@android:drawable/ic_dialog_email" />

content.xml代码如下:

  1. <TextView
  2. android:id="@+id/myTextView"
  3. android:layout_width="0dp"
  4. android:layout_height="wrap_content"
  5. android:layout_marginTop="48dp"
  6. android:hint="扫描结果"
  7. android:textSize="24sp"
  8. app:layout_constraintBottom_toBottomOf="parent"
  9. app:layout_constraintEnd_toEndOf="parent"
  10. app:layout_constraintHorizontal_bias="0.0"
  11. app:layout_constraintStart_toStartOf="parent"
  12. app:layout_constraintTop_toBottomOf="@+id/myScanButton"
  13. app:layout_constraintVertical_bias="0.0" />
  14. <EditText
  15. android:id="@+id/myEditText"
  16. android:layout_width="0dp"
  17. android:layout_height="wrap_content"
  18. android:layout_marginTop="16dp"
  19. android:ems="10"
  20. android:hint="输入要生成二维码的字符"
  21. android:inputType="textPersonName"
  22. app:layout_constraintEnd_toEndOf="parent"
  23. app:layout_constraintHorizontal_bias="0.0"
  24. app:layout_constraintStart_toStartOf="parent"
  25. app:layout_constraintTop_toTopOf="parent" />
  26. <Button
  27. android:id="@+id/myCreateButton"
  28. android:layout_width="0dp"
  29. android:layout_height="wrap_content"
  30. android:text="开始生成"
  31. android:textSize="18sp"
  32. app:layout_constraintEnd_toEndOf="parent"
  33. app:layout_constraintStart_toStartOf="parent"
  34. app:layout_constraintTop_toBottomOf="@+id/myEditText" />
  35. <ImageView
  36. android:id="@+id/myImageView"
  37. android:layout_width="202dp"
  38. android:layout_height="196dp"
  39. android:layout_marginTop="64dp"
  40. app:layout_constraintEnd_toEndOf="parent"
  41. app:layout_constraintHorizontal_bias="0.497"
  42. app:layout_constraintStart_toStartOf="parent"
  43. app:layout_constraintTop_toBottomOf="@+id/myCreateButton"
  44. app:srcCompat="@android:drawable/screen_background_light_transparent" />
  45. <Button
  46. android:id="@+id/myScanButton"
  47. android:layout_width="0dp"
  48. android:layout_height="wrap_content"
  49. android:layout_marginTop="36dp"
  50. android:text="开始扫描"
  51. android:textSize="18sp"
  52. app:layout_constraintEnd_toEndOf="parent"
  53. app:layout_constraintHorizontal_bias="0.0"
  54. app:layout_constraintStart_toStartOf="parent"
  55. 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<EncodeHintType,String> 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<height;h++){
  21. for (int w=0;w<width;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. }

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

要是有疑问大家可以加我微信详聊 yf1553653788

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

闽ICP备14008679号