Zxing仿微信快速集成二维码扫描库

前言

本文讲解一下别人写的快速集成二维码扫描库,核心的扫描功能是通过Zxing实现的


介绍

功能:

  1. 支持对本地图片Bitmap的扫描功能
  2. 支持默认的二维码页面
  3. 支持自定义UI的操作
  4. 支持对条形码的扫描功能
  5. 支持生成二维码操作
  6. 支持控制闪光灯开关

Zxing仿微信快速集成二维码扫描库_第1张图片


使用

  • 配置Mainfast权限
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.FLASHLIGHT" />

    <uses-feature android:name="android.hardware.camera" />
    <uses-feature android:name="android.hardware.camera.autofocus" />

    <uses-permission android:name="android.permission.VIBRATE" />//震动权限
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.INTERNET" />
  • 导入最新的moudle包或者依赖库

PS: moudle中它在lib添加了原始Zxing的jar包,可进行扩展

下载地址:https://download.csdn.net/download/m0_37711172/10325169

compile 'cn.yipianfengye.android:zxing-library:2.2'
  • 在Application中执行初始化操作
@Override
    public void onCreate() {
        super.onCreate();

        ZXingLibrary.initDisplayOpinion(this);
    }

  • (1)在代码中写跳转扫描二维码的操作
     case R.id.mButton:
                Intent intent = new Intent(MainActivity.this, CaptureActivity.class);
                //第二个参数是请求码,定义的常量随意填写
                startActivityForResult(intent, REQUEST_CODE);
  • 重写Activity的onActivityResult方法中接收扫描结果
   if (requestCode == REQUEST_CODE) {
            //处理扫描结果(在界面上显示)
            if (null != data) {
                Bundle bundle = data.getExtras();
                if (bundle == null) {
                    return;
                }
                if (bundle.getInt(CodeUtils.RESULT_TYPE) == CodeUtils.RESULT_SUCCESS) {
                    String result = bundle.getString(CodeUtils.RESULT_STRING);
                    Log.e("sssss", "onActivityResult: " + result);
                    Toast.makeText(this, "解析结果:" + result, Toast.LENGTH_LONG).show();
                } else if (bundle.getInt(CodeUtils.RESULT_TYPE) == CodeUtils.RESULT_FAILED) {
                    Toast.makeText(MainActivity.this, "解析二维码失败", Toast.LENGTH_LONG).show();
                }
            }
       }

默认的二维码功能已经实现,下面来看看效果


  • (2)在代码中写对二维码图片解析功能
    //调用系统API打开图库
    case R.id.mButton2:
                Intent intent2 = new Intent();
                intent2.setAction(Intent.ACTION_PICK);
                intent2.setType("image/*");
                startActivityForResult(intent2, REQUEST_IMAGE);
  • 重写Activity的onActivityResult方法中接收用户选中的图片并调用二维码图片解析API
else if (requestCode == REQUEST_IMAGE) {
            if (data != null) {
                Uri uri = data.getData();
                try {
                    CodeUtils.analyzeBitmap(ImageUtil.getImageAbsolutePath(this, uri), new CodeUtils.AnalyzeCallback() {
                        @Override
                        public void onAnalyzeSuccess(Bitmap mBitmap, String result) {
                            Toast.makeText(MainActivity.this, "解析结果:" + result, Toast.LENGTH_LONG).show();
                        }

                        @Override
                        public void onAnalyzeFailed() {
                            Toast.makeText(MainActivity.this, "解析二维码失败", Toast.LENGTH_LONG).show();
                        }
                    });

                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
      }

解析二维码图片已经实现,下面来看看效果


(3)写一个新的自定义扫描UI界面

  • 定义新的main_threexml中布局

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/activity_second"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <FrameLayout
        android:id="@+id/fl_my_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:visibility="visible"
        >FrameLayout>
          <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|center_horizontal"
        android:background="#AA333333"
        android:orientation="horizontal"
        android:paddingBottom="15dp"
        android:paddingTop="15dp">

        <LinearLayout
            android:id="@+id/linear1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="center_horizontal"
            android:orientation="vertical">

            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:background="@mipmap/ic_launcher" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="10dp"
                android:text="闪光灯"
                android:textColor="#FFFFFF" />
        LinearLayout>
     LinearLayout>
FrameLayout>

定义新的ThreeActivity执行Fragment的初始化操作

    private CaptureFragment captureFragment;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_three);
        //初始化moudle包的Fragment
        captureFragment = new CaptureFragment();
        // 为二维码扫描界面设置定制化界面
        CodeUtils.setFragmentArgs(captureFragment, R.layout.my_camera);
        captureFragment.setAnalyzeCallback(analyzeCallback);
        //启动id为fl_my_container的FrameLayout就是我们需要替换的扫描组件
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        ft.replace(R.id.fl_my_container, captureFragment).commit();
        initView();
    }
  • initView()方法里面有一个开启和关闭闪光灯的功能
  private void initView() {
        //设置闪光灯开启和关闭
        LinearLayout linearLayout = findViewById(R.id.linear1);
        linearLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (!isOpen) {
                    CodeUtils.isLightEnable(true);
                    isOpen = true;
                } else {
                    CodeUtils.isLightEnable(false);
                    isOpen = false;
                }

            }
        });
    }
  • 以上Activitiy文件中添加定义的扫描回调函数analyzeCallback
    /**
     * 二维码解析回调函数
     */
    CodeUtils.AnalyzeCallback analyzeCallback = new CodeUtils.AnalyzeCallback() {
        @Override
        public void onAnalyzeSuccess(Bitmap mBitmap, String result) {
            Intent resultIntent = new Intent();
            Bundle bundle = new Bundle();
            bundle.putInt(CodeUtils.RESULT_TYPE, CodeUtils.RESULT_SUCCESS);
            bundle.putString(CodeUtils.RESULT_STRING, result);
            resultIntent.putExtras(bundle);
            ThreeActivity.this.setResult(RESULT_OK, resultIntent);
            ThreeActivity.this.finish();
        }

        @Override
        public void onAnalyzeFailed() {
            Intent resultIntent = new Intent();
            Bundle bundle = new Bundle();
            bundle.putInt(CodeUtils.RESULT_TYPE, CodeUtils.RESULT_FAILED);
            bundle.putString(CodeUtils.RESULT_STRING, "");
            resultIntent.putExtras(bundle);
            ThreeActivity.this.setResult(RESULT_OK, resultIntent);
            ThreeActivity.this.finish();
        }
    };
  • 调用了CondeUtils.setFragmentArgs方法,主要用于修改扫描界面扫描框与透明框相对位置的,与若不调用的话,其会显示默认的组件效果,而如果调用该方法的话,可以修改扫描框与透明框的相对位置等UI效果,新建my_camera布局文件实现
  • -

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <SurfaceView
        android:id="@+id/preview_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />

    <com.uuzuche.lib_zxing.view.ViewfinderView
        android:id="@+id/viewfinder_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:inner_width="200dp"
        app:inner_height="200dp"
        app:inner_margintop="150dp"
        app:inner_corner_color="@color/scan_corner_color"
        app:inner_corner_length="30dp"
        app:inner_corner_width="5dp"
        app:inner_scan_bitmap="@drawable/scan_image"
        app:inner_scan_speed="10"
        app:inner_scan_iscircle="false"
        />
FrameLayout>
  • 自定义描边属性,可以定制微信扫描UI
<declare-styleable name="innerrect">
        <attr name="inner_width" format="dimension"/>
        <attr name="inner_height" format="dimension"/>
        <attr name="inner_margintop" format="dimension" />
        <attr name="inner_corner_color" format="color" />
        <attr name="inner_corner_length" format="dimension" />
        <attr name="inner_corner_width" format="dimension" />
        <attr name="inner_scan_bitmap" format="reference" />
        <attr name="inner_scan_speed" format="integer" />
        <attr name="inner_scan_iscircle" format="boolean" />
    declare-styleable>

(4)生成二维码图片

  • 生成带Logo的二维码图片
  button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String textContent = editText.getText().toString();
                if (TextUtils.isEmpty(textContent)) {
                    Toast.makeText(FourActivity.this, "您的输入为空!", Toast.LENGTH_SHORT).show();
                    return;
                }
                editText.setText("");
                mBitmap = CodeUtils.createImage(textContent, 400, 400,BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher)); 
                imageView.setImageBitmap(mBitmap);
            }
        });
  • 生成不带logo的二维码图片
      button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                String textContent = editText.getText().toString();
                if (TextUtils.isEmpty(textContent)) {
                    Toast.makeText(FourActivity.this, "您的输入为空!", Toast.LENGTH_SHORT).show();
                    return;
                }
                editText.setText("");
                mBitmap = CodeUtils.createImage(textContent, 400, 400, null);
                imageView.setImageBitmap(mBitmap);
            }
        });

生成二维码图片已经实现,下面来看看效果


总结

原文上的demo有好多Bug,我进行修改了一下,可以不用下载Demo也可以使用,上面标写的都很全,还是不太懂的可以看下面发的github地址

Github

你可能感兴趣的:(Android,我不是程序员)