添加依赖:
compile 'com.google.zxing:core:3.1.0' compile 'cn.bingoogolapple:bga-qrcodecore:1.0.7@aar' compile 'cn.bingoogolapple:bga-zxing:1.0.7@aar'
注册文件:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission> //调用相机 <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.INTERNET"></uses-permission> //震动(用不到震动可以去掉) <uses-permission android:name="android.permission.VIBRATE" /> //闪光灯(如不用闪光灯可以去掉) <uses-permission android:name="android.permission.FLASHLIGHT" />
<activity android:name=".ScanActivity"></activity> <activity android:name=".GenerateActivity" />
布局:
activity_generate:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:gravity="center_horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> <EditText android:layout_width="match_parent" android:layout_height="48dp" android:layout_margin="15dp" android:id="@+id/et_input" /> <LinearLayout android:layout_width="match_parent" android:layout_height="48dp" android:paddingLeft="15dp" android:paddingRight="15dp" android:layout_marginTop="15dp" android:layout_marginBottom="15dp" android:orientation="horizontal" > <TextView android:layout_width="0dp" android:layout_weight="1" android:layout_height="48dp" android:text="创建二维码" android:textSize="22sp" android:gravity="center" android:textColor="@color/colorWrite" android:background="@color/colorPrimary" android:id="@+id/tv_create" /> <TextView android:layout_marginLeft="15dp" android:layout_width="0dp" android:layout_weight="1" android:layout_height="48dp" android:text="创建logo二维码" android:textSize="22sp" android:gravity="center" android:textColor="@color/colorWrite" android:background="@color/colorPrimary" android:id="@+id/tv_createlogo" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="200dp" android:paddingLeft="15dp" android:paddingRight="15dp" android:layout_marginTop="15dp" android:layout_marginBottom="15dp" android:gravity="center" android:orientation="horizontal" > <ImageView android:layout_width="40dp" android:layout_height="40dp" android:src="@mipmap/logo" android:scaleType="centerCrop" android:id="@+id/iv_logo" /> <ImageView android:layout_marginLeft="40dp" android:layout_width="160dp" android:layout_height="160dp" android:src="@mipmap/qr_m" android:scaleType="centerCrop" android:id="@+id/iv_qr" /> </LinearLayout> <TextView android:layout_width="match_parent" android:layout_height="48dp" android:layout_margin="15dp" android:text="识别" android:textSize="22sp" android:gravity="center" android:textColor="@color/colorWrite" android:background="@color/colorPrimary" android:id="@+id/tv_read" /> </LinearLayout>activity_scan:<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <cn.bingoogolapple.qrcode.zxing.ZXingView android:id="@+id/zx_view" android:layout_width="match_parent" android:layout_height="match_parent" app:qrcv_animTime="1000" app:qrcv_borderColor="@android:color/white" app:qrcv_borderSize="1dp" app:qrcv_cornerColor="@color/colorPrimaryDark" app:qrcv_cornerLength="20dp" app:qrcv_cornerSize="3dp" app:qrcv_maskColor="#99000000" app:qrcv_rectWidth="200dp" app:qrcv_scanLineColor="@color/colorPrimaryDark" app:qrcv_scanLineSize="1dp" app:qrcv_topOffset="90dp" /> </LinearLayout>activity_mian:<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:orientation="vertical" tools:context="baway.com.erweimademo.MainActivity"> <TextView android:id="@+id/scan_qrcode" android:layout_marginTop="15dp" android:layout_width="match_parent" android:layout_height="48dp" android:background="@color/colorTransla" android:textColor="@color/colorWrite" android:textSize="20sp" android:gravity="center" android:text="扫描二维码" /> <TextView android:id="@+id/generate_qrcode" android:layout_marginTop="15dp" android:layout_width="match_parent" android:layout_height="48dp" android:background="@color/colorTransla" android:textColor="@color/colorWrite" android:textSize="20sp" android:gravity="center" android:text="生成和识别图片二维码" /> </LinearLayout>MianActivity:public class MainActivity extends Activity implements View.OnClickListener { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViewById(R.id.generate_qrcode).setOnClickListener(this); findViewById(R.id.scan_qrcode).setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.scan_qrcode: startActivity(new Intent(MainActivity.this,ScanActivity.class)); break; case R.id.generate_qrcode: startActivity(new Intent(MainActivity.this,GenerateActivity.class)); break; } } }GenerateActivity:public class GenerateActivity extends Activity implements View.OnClickListener { private ImageView ivqr; private TextView tvread; private EditText etinput; private TextView tvcreate; private TextView tvcreatelogo; private ImageView ivlogo; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_generate); this.ivlogo = (ImageView) findViewById(R.id.iv_logo); this.tvcreatelogo = (TextView) findViewById(R.id.tv_createlogo); this.tvcreate = (TextView) findViewById(R.id.tv_create); this.etinput = (EditText) findViewById(R.id.et_input); this.tvread = (TextView) findViewById(R.id.tv_read); this.ivqr = (ImageView) findViewById(R.id.iv_qr); tvcreatelogo.setOnClickListener(this); tvcreate.setOnClickListener(this); tvread.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.tv_create: //创建二维码 if(!checkIsEmpty()) createQRCode(); else Toast.makeText(GenerateActivity.this, "输入框不能为空", Toast.LENGTH_SHORT).show(); break; case R.id.tv_createlogo: //创建带logo if(!checkIsEmpty()) createQRCodeWithLogo(); else Toast.makeText(GenerateActivity.this, "输入框不能为空", Toast.LENGTH_SHORT).show(); break; case R.id.tv_read: //识别 decodeQRCode(); break; } } /** * 校验输入框是否有内容 * 没有内容返回true,有内容返回false * @return */ private boolean checkIsEmpty(){ return TextUtils.isEmpty(etinput.getText().toString().trim()); } /** * 创建二维码 */ private void createQRCode() { //生成二维码,第一个参数为要生成的文本,第二个参数为生成尺寸,第三个参数为生成回调 QRCodeEncoder.encodeQRCode(etinput.getText().toString().trim(), DisplayUtils.dp2px(GenerateActivity.this, 160), new QRCodeEncoder.Delegate() { /** * 生成成功 * @param bitmap */ @Override public void onEncodeQRCodeSuccess(Bitmap bitmap) { ivqr.setImageBitmap(bitmap); } /** * 生成失败 */ @Override public void onEncodeQRCodeFailure() { Toast.makeText(GenerateActivity.this, "生成中文二维码失败", Toast.LENGTH_SHORT).show(); } }); } /** * 创建带logo二维码 */ private void createQRCodeWithLogo() { //生成二维码,第一个参数为要生成的文本,第二个参数为生成尺寸,第三个参数为生成二维码颜色,第四个参数为logo资源,第五个参数为生成回调 QRCodeEncoder.encodeQRCode(etinput.getText().toString().trim(), DisplayUtils.dp2px(GenerateActivity.this, 160), Color.parseColor("#000000"), ((BitmapDrawable)ivlogo.getDrawable()).getBitmap(), new QRCodeEncoder.Delegate() { @Override public void onEncodeQRCodeSuccess(Bitmap bitmap) { ivqr.setImageBitmap(bitmap); } @Override public void onEncodeQRCodeFailure() { Toast.makeText(GenerateActivity.this, "生成带logo的中文二维码失败", Toast.LENGTH_SHORT).show(); } }); } /** * 解析 */ public void decodeQRCode() { Bitmap bitmap = ((BitmapDrawable)ivqr.getDrawable()).getBitmap(); decode(bitmap, "解析二维码失败"); } /** * 解析二维码,可以解析二维码、带logo二维码、条形码 * @param bitmap * @param err */ private void decode(Bitmap bitmap, final String err) { QRCodeDecoder.decodeQRCode(bitmap, new QRCodeDecoder.Delegate() { @Override public void onDecodeQRCodeSuccess(String result) { Toast.makeText(GenerateActivity.this, result, Toast.LENGTH_SHORT).show(); } @Override public void onDecodeQRCodeFailure() { Toast.makeText(GenerateActivity.this, err, Toast.LENGTH_SHORT).show(); } }); } }ScanActivity:public class ScanActivity extends Activity implements QRCodeView.Delegate { private QRCodeView mQR; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_scan); mQR = (ZXingView) findViewById(R.id.zx_view); //设置结果处理 mQR.setResultHandler(this); //开始读取二维码 } /** * 扫描二维码方法大全(已知) * * mQR.startCamera(); 开启预览,但是并未开始识别 * mQR.stopCamera(); 停止预览,并且隐藏扫描框 * mQR.startSpot(); 开始识别二维码 * mQR.stopSpot(); 停止识别 * mQR.startSpotAndShowRect(); 开始识别并显示扫描框 * mQR.stopSpotAndHiddenRect(); 停止识别并隐藏扫描框 * mQR.showScanRect(); 显示扫描框 * mQR.hiddenScanRect(); 隐藏扫描框 * mQR.openFlashlight(); 开启闪光灯 * mQR.closeFlashlight(); 关闭闪光灯 * * mQR.startSpotDelay(ms) 延迟ms毫秒后开始识别 */ /** * 扫描二维码成功 * @param result */ @Override public void onScanQRCodeSuccess(String result) { Toast.makeText(ScanActivity.this, result, Toast.LENGTH_SHORT).show(); //震动 vibrate(); //停止预览 mQR.stopCamera(); } /** * 打开相机出错 */ @Override public void onScanQRCodeOpenCameraError() { Toast.makeText(ScanActivity.this, "打开相机出错!请检查是否开启权限!", Toast.LENGTH_SHORT).show(); } /** * 震动 */ private void vibrate() { Vibrator vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE); vibrator.vibrate(200); } @Override protected void onStart() { super.onStart(); //启动相机 mQR.startCamera(); } @Override protected void onStop() { mQR.stopCamera(); super.onStop(); } }