安卓开发之二维码扫描(可以做自定义扫描区域)

  在使用官方的框架和第三方的框架的时候发现了一个很大的问题,那就是扫描的区域就只有从屏幕中间扩展出来的扫描区域进行扫描,没有说可以自己定义扫描区域的方法,我很纳闷,也可能是我在读别人的源码的时候忽略掉了,但是仅仅只有这个问题也就算了,但是偏偏实现的逻辑是在activity中,如果仿照这个Activity在自己的项目中使用的话感觉通用性太低了,所以,强迫症犯了,干脆自己写一个工具类来给别人开放出去,让别人调用吧,于是参考极光的调用方式以及https://github.com/yangxixi88/ZxingLite这个比人写的工具,以及官方代码:https://github.com/zxing/zxing这三个开始写自己的工具吧。

  官方的代码和别人的工具代码最终其实就三步,分别是界面创建时的操作、界面获取到焦点与失去焦点的操作,所以我就干脆直接在工具类中创建这三个方法,然后将Activity实例传入,用来给一些需要Activity实例的方法调用,然后Activity的oncreate、onpause、onresume这三个方法中分别调用工具类中的三个方法,用来初始化以及使用二维码扫描等操作。

  具体使用不是很复杂,就是实例化工具类,调用相关方法就可以,至于具体的思路直接按调用方法一步一步向下走就可以了,入口其实就是onresume方法,从这里按方法向下走就可以,每一步都有解释的!

  其中的方法有:

  1. onCreate(Activity activity);//在扫描界面创建的时候调用该方法,用来创建一些必须变量;

  2. onResume();//在界面获得焦点的时候需要调用该方法,用来初始化一些管理器与扫描配置,但是在调用之前需要请求两个权限;

  3. onPause();//在扫描界面的onpause方法中需要调用这个方法,用来在界面失去焦点的时候关闭不必要线程;

  4. getSurfaceView();//获取sufaceview;

  5. handleDecode(Result rawResult, Bitmap barcode, float scaleFactor);//扫描结果回传;

  6. showScanImage(Bitmap bitmap);//当前正在扫描的灰度图;

  7. getLeftPercent();//左侧非扫描界面百分比,范围(0-1);

  8. getTopPercent();//左侧非扫描界面百分比,范围(0-1);

  9. getRighttPercent();//左侧非扫描界面百分比,范围(0-1);

  10. getBottomPercent();//左侧非扫描界面百分比,范围(0-1);

  11. isRunningScan();//是否要扫描,因为在获得扫描结果后会回传到界面当中,但是,当回传的界面执行onpause方法后会重置扫描,所以需要这个值;

  12. initCamera(SurfaceHolder surfaceHolder);//初始化相机参数;

  13. resetDecode();//重置解码器,使其可以重新进行扫描操作;

调用demo:

package com.myzxingtest.android;

import android.Manifest;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.view.SurfaceView;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;

import com.google.zxing.Result;
import com.myzxing.android.in.QrCodeEncode;


public class MainActivity extends AppCompatActivity {

private SurfaceView surfaceView;
private ImageView imgView;
private QrCodeEncode qrCodeEncode;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    //异常信息收集
    CrashHandler catchHandler = CrashHandler.getInstance();
    catchHandler.init(getApplicationContext());

    setContentView(R.layout.activity_main);

    surfaceView = findViewById(R.id.sufaceView);
    imgView = findViewById(R.id.imgView);

    qrCodeEncode = new QrCodeEncode() {
        @Override
        protected SurfaceView getSurfaceView() {
            return surfaceView;
        }

        @Override
        protected void handleDecode(final Result rawResult, final Bitmap barcode, float scaleFactor) {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    imgView.setImageBitmap(barcode);
                    Toast.makeText(MainActivity.this, rawResult.getText(), Toast.LENGTH_LONG).show();
                }
            });
        }

        @Override
        protected void showScanImage(final Bitmap bitmap) {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    imgView.setImageBitmap(bitmap);
                }
            });
        }

        @Override
        protected float getLeftPercent() {
            return 0.4f;
        }

        @Override
        protected float getTopPercent() {
            return 0.4f;
        }

        @Override
        protected float getRighttPercent() {
            return 0.4f;
        }

        @Override
        protected float getBottomPercent() {
            return 0.4f;
        }

        @Override
        protected boolean isRunningScan() {
            return true;
        }
    };
    qrCodeEncode.onCreate(this);

    imgView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            imgView.setImageDrawable(null);
            qrCodeEncode.resetDecode();
        }
    });
}

@Override
protected void onPause() {
    super.onPause();
    qrCodeEncode.onPause();
}

@Override
protected void onResume() {
    super.onResume();
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
        // TODO: Consider calling
        //    ActivityCompat#requestPermissions
        // here to request the missing permissions, and then overriding
        //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
        //                                          int[] grantResults)
        // to handle the case where the user grants the permission. See the documentation
        // for ActivityCompat#requestPermissions for more details.
        return;
    }
    qrCodeEncode.onResume();
}

}

代码地址:https://github.com/Loren-Wang/MyZXing

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值