添加权限和依赖
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.FLASHLIGHT" />
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'
布局文件 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="@drawable/logo"
android:scaleType="centerCrop"
android:id="@+id/iv_logo"
/>
<ImageView
android:layout_marginLeft="40dp"
android:layout_width="160dp"
android:layout_height="160dp"
android:src="@drawable/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_main
<?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="fan.qrcodedemo.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>
布局文件 activity_scan
<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" />
MainActivity
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 android.widget.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.startSpot();
}
/**
* 扫描二维码方法大全(已知)
*
* 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();
}
}
styles
<style name="AppTheme.NoActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
<style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" />
<style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" />
string
<string name="title_activity_scan">ScanActivity</string>