二维码扫描--基于bingoogolapple + Android Studio 2.3.3

本文介绍了一种基于bingoogolapple库的简易二维码扫描功能实现方法。通过在Android项目中引入必要的依赖,并按照步骤配置权限及Activity,可以快速实现二维码扫描功能。

前言:

Android开发之实现二维码扫描

正文:

网上有很多的二维码扫描的教程,但,对于刚入门的兄弟们来说,真的很残忍。

既然有需求,就去网上找相应的教程是吧,而且,就喜欢那种简单粗暴的先实现下功能,再进行代码的改动,达到自己的需求。

嗯,我只是刚入门的小学生。

扫描二维码,当然是官方的Zxing库了,这个是必须要学习的。
但是,如果只是实现功能练下手,咱就接着往下看。

bingoogolapple在功能实现上就是很简洁的一个基于zxing的库。
本文就此展开。

1. 首先,在Model的build.gradel中添加如下代码:


dependencies {
    //添加如下代码
    compile 'com.google.zxing:core:3.2.1'
    compile 'cn.bingoogolapple:bga-qrcodecore:1.1.3@aar'
    compile 'cn.bingoogolapple:bga-zxing:1.1.3@aar'
}

2. 配置AndroidManifest.xml

    <!-- 扫码 -->
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.FLASHLIGHT" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

3. 新建ScanCodeActivity

public class ScanCodeActivity extends Activity implements QRCodeView.Delegate {
    private static final int REQUEST_CODE_CAMERA = 999;
    private static final String TAG = ScanCodeActivity.class.getSimpleName();

    private QRCodeView mQRCodeView;

    private String scanResult;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_scan_code);

        mQRCodeView = (ZXingView) findViewById(R.id.zxingview);
        mQRCodeView.setDelegate(this);

        Log.e(TAG, "扫码:01");
    }

    @Override
    protected void onStart() {
        super.onStart();
        mQRCodeView.startCamera();
//        mQRCodeView.startCamera(Camera.CameraInfo.CAMERA_FACING_FRONT);
        mQRCodeView.startSpot();

        Log.e(TAG, "扫码:02");
    }

    @Override
    protected void onStop() {
        mQRCodeView.stopCamera();
        super.onStop();

        Log.e(TAG, "扫码:03");
    }

    @Override
    protected void onDestroy() {
        mQRCodeView.onDestroy();
        super.onDestroy();
        Log.e(TAG, "扫码:04");
    }

    //震动器
    private void vibrate() {
        Vibrator vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
        vibrator.vibrate(100);

        Log.e(TAG, "扫码:05");
    }

    @Override
    public void onScanQRCodeSuccess(String result) {
        scanResult = result;
        Log.i(TAG, "result:" + result);
        //Toast.makeText(this, result, Toast.LENGTH_SHORT).show();
        vibrate();//震动
        mQRCodeView.stopSpot();

        if (!TextUtils.isEmpty(result)) {
            mQRCodeView.stopCamera();
            mQRCodeView.onDestroy();
            new Handler().postDelayed(new Runnable() {  //开启线程阻塞,以便查看是否登录成功。做调试用
                public void run() {
                    // TODO Auto-generated method stub
                }
            }, 10000);

            Intent intent = new Intent(ScanCodeActivity.this, showMessage.class);
            intent.putExtra("url", result);
            //intent.setData(Uri.parse(result));
            startActivity(intent);
            finish();
        } else {
            Toast.makeText(this, "链接无效,请重新扫描", Toast.LENGTH_SHORT).show();
            mQRCodeView.startSpot();
        }
        Log.e(TAG, "扫码:06");
    }

    @Override
    public void onScanQRCodeOpenCameraError() {
        Log.e(TAG, "无相机权限,打开相机出错");

        ActivityCompat.requestPermissions(this,
                new String[]{Manifest.permission.CAMERA}, REQUEST_CODE_CAMERA);
        Log.e(TAG, "扫码:07");
    }

    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.start_spot:
                mQRCodeView.startSpot();
                break;
            case R.id.stop_spot:
                mQRCodeView.stopSpot();
                break;
            case R.id.open_flashlight:
                mQRCodeView.openFlashlight();
                break;
            case R.id.close_flashlight:
                mQRCodeView.closeFlashlight();
                break;
            case R.id.rl_back:
                //onDestroy();
                mQRCodeView.stopCamera();
                mQRCodeView.onDestroy();
                finish();
                break;
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        if (requestCode == REQUEST_CODE_CAMERA) {
            mQRCodeView.startCamera();
            mQRCodeView.startSpot();
        }
    }
}

布局文件如下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout style="@style/MatchMatch"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <cn.bingoogolapple.qrcode.zxing.ZXingView
        android:id="@+id/zxingview"
        style="@style/MatchMatch"
        app:qrcv_animTime="2000"
        app:qrcv_barCodeTipText="将条码放入框内,即可自动扫描"
        app:qrcv_borderColor="@android:color/white"
        app:qrcv_borderSize="1dp"
        app:qrcv_cornerColor="#f57257"
        app:qrcv_cornerLength="20dp"
        app:qrcv_cornerSize="3dp"
        app:qrcv_isBarcode="false"
        app:qrcv_isOnlyDecodeScanBoxArea="true"
        app:qrcv_isScanLineReverse="true"
        app:qrcv_isShowDefaultGridScanLineDrawable="true"
        app:qrcv_isShowDefaultScanLineDrawable="false"
        app:qrcv_isShowTipBackground="true"
        app:qrcv_isShowTipTextAsSingleLine="false"
        app:qrcv_isTipTextBelowRect="false"
        app:qrcv_maskColor="#33FFFFFF"
        app:qrcv_qrCodeTipText="将二维码放入框内,即可自动扫描"
        app:qrcv_rectWidth="200dp"
        app:qrcv_scanLineColor="#f57257"
        app:qrcv_scanLineMargin="0dp"
        app:qrcv_scanLineSize="1dp"
        app:qrcv_tipTextColor="@android:color/white"
        app:qrcv_tipTextSize="12sp"
        app:qrcv_toolbarHeight="0dp"
        app:qrcv_topOffset="180dp"/>

    <LinearLayout
        style="@style/MatchWrap.Vertical"
        android:layout_alignParentBottom="true"
        android:layout_marginBottom="50dp">

        <LinearLayout style="@style/MatchWrap.Horizontal">

            <TextView
                android:id="@+id/start_spot"
                style="@style/AutoWrapTv"
                android:text="开始识别"
                android:visibility="gone"/>

            <TextView
                android:id="@+id/stop_spot"
                style="@style/AutoWrapTv"
                android:text="暂停识别"
                android:visibility="gone"/>

            <TextView
                android:id="@+id/open_flashlight"
                style="@style/AutoWrapTv"
                android:text="开灯"/>

            <TextView
                android:id="@+id/close_flashlight"
                style="@style/AutoWrapTv"
                android:text="关灯"/>

        </LinearLayout>

    </LinearLayout>

    <RelativeLayout
        android:id="@+id/rl_back"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:layout_marginTop="30dp"
        android:onClick="onClick"
        android:layout_marginLeft="10dp">


    </RelativeLayout>
    <TextView
        android:id="@+id/text"
        android:layout_height="match_parent"
        android:layout_width="match_parent"
        />
</RelativeLayout>

4. 新建showMessage(扫码成功后的跳转Activity)

public class showMessage extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_show_message);

        Intent intent = getIntent();
        String str = intent.getStringExtra("url");
        Toast.makeText(this, str,Toast.LENGTH_SHORT).show();

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值