实现一个自定义布局的扫码功能

  1. 开源项目地址:https://github.com/jenly1314/ZXingLite
  2. 在Project的 build.gradle 里面添加远程仓库
    allprojects {
        repositories {
            //...
            mavenCentral()
        }
    }
  3. 在Module的 build.gradle 里面添加引入依赖项
    implementation 'com.github.jenly1314:zxing-lite:2.1.1'

快速实现扫码有以下几种方式:

1、直接使用CaptureActivity或者CaptureFragment。(纯洁的扫码,无任何添加剂)

2、通过继承CaptureActivity或者CaptureFragment并自定义布局。(适用于大多场景,并无需关心扫码相关逻辑,自定义布局时需覆写getLayoutId方法)实现示例:CustomCaptureActivity 和 QRCodeActivity

3、在你项目的Activity或者Fragment中实例化一个CameraScan即可。(适用于想在扫码界面写交互逻辑,又因为项目架构或其它原因,无法直接或间接继承CaptureActivity或CaptureFragment时使用)实现示例:CustomActivity

4、继承CameraScan自己实现一个,可参照默认实现类DefaultCameraScan,其它步骤同方式3。(扩展高级用法,谨慎使用)

布局示例

可自定义布局(覆写getLayoutId方法),布局内至少要保证有PreviewView。

PreviewView 用来预览,布局内至少要保证有PreviewView,如果是继承CaptureActivity或CaptureFragment,控件id可覆写getPreviewViewId方法自定义

ViewfinderView 用来渲染扫码视图,给用户起到一个视觉效果,本身扫码识别本身没有关系,如果是继承CaptureActivity或CaptureFragment,控件id可复写getViewfinderViewId方法自定义,默认为previewView,返回0表示无需ViewfinderView

ivFlashlight 用来内置手电筒,如果是继承CaptureActivity或CaptureFragment,控件id可复写getFlashlightId方法自定义,默认为ivFlashlight。返回0表示无需内置手电筒。您也可以自己去定义

代码示例 (二维码/条形码)

    //跳转的默认扫码界面
    startActivityForResult(new Intent(context,CaptureActivity.class),requestCode);

    //生成二维码
    CodeUtils.createQRCode(content,600,logo);
    //生成条形码
    CodeUtils.createBarCode(content, BarcodeFormat.CODE_128,800,200);
    //解析条形码/二维码
    CodeUtils.parseCode(bitmap);
    //解析二维码
    CodeUtils.parseQRCode(bitmap);

个人做法记录:

新建一个activity继承CaptureActivity。

package com.efuture.androidmvvmdemo.activity;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.Toast;

import androidx.annotation.Nullable;

import com.efuture.androidmvvmdemo.R;
import com.gyf.immersionbar.ImmersionBar;
import com.king.zxing.CaptureActivity;
import com.king.zxing.util.CodeUtils;

import java.io.FileNotFoundException;

public class QrCodeActivity extends CaptureActivity implements View.OnClickListener {

    // 相册
    private ImageView iv_photo;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 设置状态栏颜色为白色
        ImmersionBar.with(this).statusBarColor(R.color.black)
                .fitsSystemWindows(true).init();
        iv_photo = findViewById(R.id.iv_photo);
        iv_photo.setOnClickListener(this);
    }

    @Override
    public int getLayoutId() {
        return R.layout.activity_qr_code;
    }

    @Override
    public int getFlashlightId() {
        return R.id.ll_Flashlight;
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            // 相册
            case R.id.iv_photo:
                //打开相册
                Intent intent = new  Intent(Intent.ACTION_PICK);
                //指定获取的是图片
                intent.setType("image/*");
                startActivityForResult(intent, 1);
                break;
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode != Activity.RESULT_OK) {
            return;
        }
        switch (requestCode) {
            // 从相册返回得话
            case 1:
                if (data != null) {
                    Uri uris;
                    uris = data.getData();
                    Bitmap bitmap = null;
                    // Uri转化为Bitmap
                    try {
                        bitmap = getBitmapFromUri(uris);
                    } catch (FileNotFoundException e) {
                        e.printStackTrace();
                    }
                    //生成二维码
                    CodeUtils.createQRCode("aaaaa", 600, bitmap);
                    //解析二维码
                    String s = CodeUtils.parseQRCode(bitmap);
                    Toast.makeText(this, s, Toast.LENGTH_SHORT).show();
                }

                break;
        }
    }

    // Uri转化为Bitmap
    private Bitmap getBitmapFromUri(Uri uri) throws FileNotFoundException {
        Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri));
        return bitmap;
    }
}

这个是布局文件:



    

    
    

    
    

    
        
        
    

    
        
        

        
        
    

跳转到这个activity,就会打开扫码界面了。

// 跳转的扫码界面
startActivityForResult(new Intent(requireContext(), QrCodeActivity.class), 1);

你可能感兴趣的:(安卓开发学习,java,服务器,开发语言)