Zxing的使用
导入依赖:
compile 'cn.yipianfengye.android:zxing-library:2.2'
申请权限:
<!--震动权限-->
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!--照相机权限-->
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" /> <!-- 使用照相机权限 -->
<uses-feature android:name="android.hardware.camera.autofocus" /> <!-- 自动聚焦权限 -->
如果是Android6.0以上版本进行动态申请权限
String[] permissions=new String[]{
Manifest.permission.
WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA};
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1) {
requestPermissions(permissions,PERMS_REQUEST_CODE);
}
第一步操作为初始化:
ZXingLibrary.initDisplayOpinion(this);
通过intent进行简单扫描:
//设置进行扫描二维码
Intent intent = new Intent();
intent.setClass(MainActivity.this, CaptureActivity.class);
startActivityForResult(intent,REQUEST);
或者使用手机图片进行扫描
//进行跳转到图片
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("image/*");
startActivityForResult(intent, REQUEST_IMAGE);
简单扫描结果进行处理:
if(requestCode == 1){
//进行简单扫描
//获取数据
if(data != null){
Bundle bundle = data.getExtras();
//判断bundle中存储的数据是否代表解析成功
if(bundle.getInt(CodeUtils.RESULT_TYPE) == CodeUtils.RESULT_SUCCESS){
//获取解析结果
String result = bundle.getString(CodeUtils.RESULT_STRING);
Toast.makeText(MainActivity.this,"解析结果"+result,Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(MainActivity.this, "解析二维码失败", Toast.LENGTH_LONG).show();
}
}
}
图库中图片二维码处理结果:
public static String deCodeQR(Bitmap bitmap) {
int width = bitmap.getWidth();
int height = bitmap.getHeight();
int[] pixels = new int[width * height];
bitmap.getPixels(pixels, 0, width, 0, 0, width, height);
RGBLuminanceSource source = new RGBLuminanceSource(width, height, pixels);
BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(source));
Result result = null;
QRCodeReader reader = new QRCodeReader();
try {
result = reader.decode(binaryBitmap);
} catch (NotFoundException e) {
e.printStackTrace();
} catch (ChecksumException e) {
e.printStackTrace();
} catch (FormatException e) {
e.printStackTrace();
}
if(result == null || result.equals("")){
return "解析结果失败";
}
return result.getText();
}
进行获取扫描数据:
if(requestCode == 2){
//进行图片扫描
if(data != null){
//获取Uri
Uri uri = data.getData();
ContentResolver contentResolver = getContentResolver();
try {
Bitmap bitmap = MediaStore.Images.Media.getBitmap(contentResolver, uri);//获取对应的Bitmap图片
//解析bitmap二维码图片
String s = deCodeQR(bitmap);
Toast.makeText(this,s,Toast.LENGTH_SHORT).show();
} catch (IOException e) {
e.printStackTrace();
}
}
}
设置自定义布局来进行扫描二维码:
两个布局文件如下:
1.在values的colors文件下添加颜色,决定了二维码四个边框的颜色
#0effc22.
2.在drawable文件下添加一个scan_image.png的图片,就是二维码扫描的那条横线3.创建一个新的Activity(demo里叫 SecondActivity )集成FragmentActivity,在清单文件里进行配置。
修改新的Activity布局文件,是二维码的背景布局
技术点:启动id为fl_my_container的FrameLayout就是我们需要替换的扫描组件,也就是说我们
会将我们定义的扫描Fragment替换到id为fl_my_container的FrameLayout的位置。
而上面的button是我们添加的一个额外的控件,在这里你可以添加任意的控件,各种UI效果等。
- 创建my_camera.xml布局文件,这个就是扫描二维码的界面
要自定义二维码扫描页面,就在这个布局里进行修改,这里我加了一个ToolBar,一个Button按钮
用来退出扫描。
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/activity_second"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/second_button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|center_horizontal"
android:layout_marginBottom="10dp"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:layout_marginTop="20dp"
android:text="取消二维码扫描" />
<FrameLayout
android:id="@+id/fl_my_container"
android:layout_width="match_parent"
android:layout_height="match_parent">
</FrameLayout>
</FrameLayout>
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<SurfaceView
android:id="@+id/preview_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<com.uuzuche.lib_zxing.view.ViewfinderView
android:id="@+id/viewfinder_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:inner_corner_length="30dp"
app:inner_corner_width="5dp"
app:inner_height="200dp"
app:inner_margintop="150dp"
app:inner_scan_iscircle="false"
app:inner_scan_speed="10"
app:inner_width="200dp" />
</FrameLayout>
SecondActivity文件(代替CaptureActivity.java)
package com.it.zxing;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import com.uuzuche.lib_zxing.activity.CaptureFragment;
import com.uuzuche.lib_zxing.activity.CodeUtils;
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment);
CodeUtils.AnalyzeCallback analyzeCallback = new CodeUtils.AnalyzeCallback() {
@Override
public void onAnalyzeSuccess(Bitmap mBitmap, String result) {
Intent resultIntent = new Intent();
Bundle bundle = new Bundle();
bundle.putInt(CodeUtils.RESULT_TYPE, CodeUtils.RESULT_SUCCESS);
bundle.putString(CodeUtils.RESULT_STRING, result);
resultIntent.putExtras(bundle);
SecondActivity.this.setResult(RESULT_OK, resultIntent);
SecondActivity.this.finish();
}
@Override
public void onAnalyzeFailed() {
Intent resultIntent = new Intent();
Bundle bundle = new Bundle();
bundle.putInt(CodeUtils.RESULT_TYPE, CodeUtils.RESULT_FAILED);
bundle.putString(CodeUtils.RESULT_STRING, "");
resultIntent.putExtras(bundle);
SecondActivity.this.setResult(RESULT_OK, resultIntent);
SecondActivity.this.finish();
}
};
//在Activity中执行Fragment的初始化操作
//执行扫面Fragment的初始化操作
CaptureFragment captureFragment = new CaptureFragment();
// 为二维码扫描界面设置定制化界面
CodeUtils.setFragmentArgs(captureFragment, R.layout.my_camera);
captureFragment.setAnalyzeCallback(analyzeCallback);
getSupportFragmentManager().beginTransaction().replace(R.id.fl_my_container, captureFragment).commit();
//进行展示
}
}
生成二维码图片(不带logo)
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String textContent = editText.getText().toString();
if (TextUtils.isEmpty(textContent)) {
Toast.makeText(ThreeActivity.this, "您的输入为空!", Toast.LENGTH_SHORT).show();
return;
}
editText.setText("");
mBitmap = CodeUtils.createImage(textContent, 400, 400, null);
imageView.setImageBitmap(mBitmap);
}
});