快速集成二维码扫描库"/>
Zxing仿微信快速集成二维码扫描库
前言
本文讲解一下别人写的快速集成二维码扫描库,核心的扫描功能是通过Zxing实现的
介绍
功能:
- 支持对本地图片Bitmap的扫描功能
- 支持默认的二维码页面
- 支持自定义UI的操作
- 支持对条形码的扫描功能
- 支持生成二维码操作
- 支持控制闪光灯开关
使用
- 配置Mainfast权限
<uses-permission android:name="android.permission.CAMERA" /><uses-permission android:name="android.permission.FLASHLIGHT" /><uses-feature android:name="android.hardware.camera" /><uses-feature android:name="android.hardware.camera.autofocus" /><uses-permission android:name="android.permission.VIBRATE" />//震动权限<uses-permission android:name="android.permission.WAKE_LOCK" /><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.INTERNET" />
- 导入最新的moudle包或者依赖库
PS: moudle中它在lib添加了原始Zxing的jar包,可进行扩展
下载地址: 'cn.yipianfengye.android:zxing-library:2.2'
- 在Application中执行初始化操作
@Overridepublic void onCreate() {super.onCreate();ZXingLibrary.initDisplayOpinion(this);}
- (1)在代码中写跳转扫描二维码的操作
case R.id.mButton:Intent intent = new Intent(MainActivity.this, CaptureActivity.class);//第二个参数是请求码,定义的常量随意填写startActivityForResult(intent, REQUEST_CODE);
- 重写Activity的onActivityResult方法中接收扫描结果
if (requestCode == REQUEST_CODE) {//处理扫描结果(在界面上显示)if (null != data) {Bundle bundle = data.getExtras();if (bundle == null) {return;}if (bundle.getInt(CodeUtils.RESULT_TYPE) == CodeUtils.RESULT_SUCCESS) {String result = bundle.getString(CodeUtils.RESULT_STRING);Log.e("sssss", "onActivityResult: " + result);Toast.makeText(this, "解析结果:" + result, Toast.LENGTH_LONG).show();} else if (bundle.getInt(CodeUtils.RESULT_TYPE) == CodeUtils.RESULT_FAILED) {Toast.makeText(MainActivity.this, "解析二维码失败", Toast.LENGTH_LONG).show();}}}
默认的二维码功能已经实现,下面来看看效果:
- (2)在代码中写对二维码图片解析功能
//调用系统API打开图库case R.id.mButton2:Intent intent2 = new Intent();intent2.setAction(Intent.ACTION_PICK);intent2.setType("image/*");startActivityForResult(intent2, REQUEST_IMAGE);
- 重写Activity的onActivityResult方法中接收用户选中的图片并调用二维码图片解析API
else if (requestCode == REQUEST_IMAGE) {if (data != null) {Uri uri = data.getData();try {CodeUtils.analyzeBitmap(ImageUtil.getImageAbsolutePath(this, uri), new CodeUtils.AnalyzeCallback() {@Overridepublic void onAnalyzeSuccess(Bitmap mBitmap, String result) {Toast.makeText(MainActivity.this, "解析结果:" + result, Toast.LENGTH_LONG).show();}@Overridepublic void onAnalyzeFailed() {Toast.makeText(MainActivity.this, "解析二维码失败", Toast.LENGTH_LONG).show();}});} catch (Exception e) {e.printStackTrace();}}}
解析二维码图片已经实现,下面来看看效果:
(3)写一个新的自定义扫描UI界面
- 定义新的main_threexml中布局
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android=""android:id="@+id/activity_second"android:layout_width="match_parent"android:layout_height="match_parent"><FrameLayout
android:id="@+id/fl_my_container"android:layout_width="match_parent"android:layout_height="match_parent"android:visibility="visible"></FrameLayout><LinearLayout
android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_gravity="bottom|center_horizontal"android:background="#AA333333"android:orientation="horizontal"android:paddingBottom="15dp"android:paddingTop="15dp"><LinearLayout
android:id="@+id/linear1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:gravity="center_horizontal"android:orientation="vertical"><ImageView
android:layout_width="wrap_content"android:layout_height="wrap_content"android:background="@mipmap/ic_launcher" /><TextView
android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="10dp"android:text="闪光灯"android:textColor="#FFFFFF" /></LinearLayout></LinearLayout>
</FrameLayout>
定义新的ThreeActivity执行Fragment的初始化操作
private CaptureFragment captureFragment;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_three);//初始化moudle包的FragmentcaptureFragment = new CaptureFragment();// 为二维码扫描界面设置定制化界面CodeUtils.setFragmentArgs(captureFragment, R.layout.my_camera);captureFragment.setAnalyzeCallback(analyzeCallback);//启动id为fl_my_container的FrameLayout就是我们需要替换的扫描组件FragmentTransaction ft = getSupportFragmentManager().beginTransaction();ft.replace(R.id.fl_my_container, captureFragment)mit();initView();}
- initView()方法里面有一个开启和关闭闪光灯的功能
private void initView() {//设置闪光灯开启和关闭LinearLayout linearLayout = findViewById(R.id.linear1);linearLayout.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if (!isOpen) {CodeUtils.isLightEnable(true);isOpen = true;} else {CodeUtils.isLightEnable(false);isOpen = false;}}});}
- 以上Activitiy文件中添加定义的扫描回调函数analyzeCallback
/*** 二维码解析回调函数*/CodeUtils.AnalyzeCallback analyzeCallback = new CodeUtils.AnalyzeCallback() {@Overridepublic 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);ThreeActivity.this.setResult(RESULT_OK, resultIntent);ThreeActivity.this.finish();}@Overridepublic 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);ThreeActivity.this.setResult(RESULT_OK, resultIntent);ThreeActivity.this.finish();}};
- 调用了CondeUtils.setFragmentArgs方法,主要用于修改扫描界面扫描框与透明框相对位置的,与若不调用的话,其会显示默认的组件效果,而如果调用该方法的话,可以修改扫描框与透明框的相对位置等UI效果,新建my_camera布局文件实现
- -
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android=""xmlns:app=""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_width="200dp"app:inner_height="200dp"app:inner_margintop="150dp"app:inner_corner_color="@color/scan_corner_color"app:inner_corner_length="30dp"app:inner_corner_width="5dp"app:inner_scan_bitmap="@drawable/scan_image"app:inner_scan_speed="10"app:inner_scan_iscircle="false"/>
</FrameLayout>
- 自定义描边属性,可以定制微信扫描UI
<declare-styleable name="innerrect"><attr name="inner_width" format="dimension"/><!-- 控制扫描框的宽度 --><attr name="inner_height" format="dimension"/><!-- 控制扫描框的高度 --><attr name="inner_margintop" format="dimension" /><!-- 控制扫描框距离顶部的距离 --><attr name="inner_corner_color" format="color" /><!-- 控制扫描框四角的颜色 --><attr name="inner_corner_length" format="dimension" /><!-- 控制扫描框四角的长度 --><attr name="inner_corner_width" format="dimension" /><!-- 控制扫描框四角的宽度 --><attr name="inner_scan_bitmap" format="reference" /><!-- 控制扫描图 --><attr name="inner_scan_speed" format="integer" /><!-- 控制扫描速度 --><attr name="inner_scan_iscircle" format="boolean" /><!-- 控制小圆点是否展示 --></declare-styleable>
(4)生成二维码图片
- 生成带Logo的二维码图片
button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {String textContent = editText.getText().toString();if (TextUtils.isEmpty(textContent)) {Toast.makeText(FourActivity.this, "您的输入为空!", Toast.LENGTH_SHORT).show();return;}editText.setText("");mBitmap = CodeUtils.createImage(textContent, 400, 400,BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher)); imageView.setImageBitmap(mBitmap);}});
- 生成不带logo的二维码图片
button1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {String textContent = editText.getText().toString();if (TextUtils.isEmpty(textContent)) {Toast.makeText(FourActivity.this, "您的输入为空!", Toast.LENGTH_SHORT).show();return;}editText.setText("");mBitmap = CodeUtils.createImage(textContent, 400, 400, null);imageView.setImageBitmap(mBitmap);}});
生成二维码图片已经实现,下面来看看效果:
总结
原文上的demo有好多Bug,我进行修改了一下,可以不用下载Demo也可以使用,上面标写的都很全,还是不太懂的可以看下面发的github地址
Github
更多推荐
Zxing仿微信快速集成二维码扫描库
发布评论