ZXing示例源码及核心core包解析教程

版权申诉
0 下载量 124 浏览量 更新于2024-10-24 收藏 1.15MB ZIP 举报
资源摘要信息: "Android应用源码之ZXing示例源码和核心core包.zip" 知识点: 1. Android平台与ZXing库介绍: Android是一个基于Linux内核的开源操作系统,广泛应用于智能手机和平板电脑等移动设备。它由Google主导开发,并且拥有一个活跃的开源社区。ZXing(“Zebra Crossing”的缩写)是一个开源的、用Java实现的库,用于解析多种格式的一维/二维条码(比如QR码、条形码等)。在Android开发中,ZXing库常被集成用于实现移动设备的条码扫描功能。 2. 条码扫描技术原理: 条码扫描技术是通过光学扫描装置将条码上的条纹与空白按照特定的编码规则转换为电子信号,再将电子信号转换成计算机能识别的数据。二维码(例如QR码)比传统的一维条码能存储更多的信息,并且有错误纠正功能,即使部分受损仍可识别。 3. ZXing在Android中的应用: 在Android应用中,开发者通常需要将ZXing库集成到项目中,以便能够调用其功能来扫描和解析条码。ZXing的Android应用源码包含了各个部分的实现,包括用户界面(UI)、相机控制、图像处理、条码解析和解码逻辑等。通过ZXing库,开发者可以快速地为Android应用添加条码扫描功能,而无需从零开始编写复杂的扫描和解码算法。 4. Android源码结构: 通常来说,一个完整的Android项目源码会包含多个文件和目录,例如Java源代码文件(.java)、资源文件夹(res/)、资产文件夹(assets/)、Android清单文件(AndroidManifest.xml)等。源码文件夹通常会包括项目的业务逻辑、用户界面布局、资源文件等。了解这些文件和目录的布局有助于开发者更有效地管理和维护代码。 5. 如何集成ZXing库到Android项目: 集成ZXing库到Android项目可以通过多种方式实现,比如直接下载ZXing项目源码、使用Gradle构建文件中的依赖管理来导入zxing-core库,或者下载现成的aar文件进行集成。开发者需要根据自己的项目需求和版本兼容性来选择合适的集成方式。 6. 核心core包功能: ZXing的核心库(core包)提供了主要的条码扫描和解码功能。开发者需要关注的核心类包括BarcodeFormat,它定义了所有支持的条码格式;Reader,它是一个条码读取器的接口;还有MultiFormatReader,这是一个实现了Reader接口的具体类,用于解析多种格式的条码。此外,源码中会包含用于处理图像和识别条码的各种算法实现。 7. 示例源码的作用: 示例源码能够提供一个实际的应用场景,帮助开发者理解如何使用ZXing库进行条码扫描。通常这些示例会包含如何启动相机预览、如何捕获图像、如何将图像转换为灰度图、以及如何应用特定的条码解码算法等关键步骤。这些示例对于初学者来说是非常有价值的,可以加快学习和开发过程。 8. 文件名称和文件列表解析: 压缩包文件名称为“Android应用源码之ZXing示例源码和核心core包.zip”,这表明了压缩包内含的文件内容。在文件列表中,可能会包含源码文件、文档、示例项目和相关的资源文件。开发者需要解压缩这个文件包,然后按照Android项目的结构来查看和分析其中的文件。这包括各种.java和.xml文件、库依赖配置文件以及可能存在的README文件或其他帮助文档。 通过以上知识点的介绍,开发者可以对如何在Android应用中使用ZXing库实现条码扫描功能有一个基本的理解。同时,通过分析提供的示例源码,开发者可以更深入地学习ZXing的集成和使用方法。
2017-11-22 上传
二维码现在越来越火爆,使用的越发广泛,对于二维码二维码的生成与解析,有多种途径,这里我选择用google老大的ZXing。    其中刘超大神使用ZXing写了一个快速集成二维码扫描的工具类,实现其核心的实现扫描的功能。使用时通过调用二维码工具类,几行代码就可以实现二维码扫描的功能! 一、实现对二维码的扫描 使用步骤: 1.在module的build.gradle中dependencies添加 compile 'cn.yipianfengye.android:zxing-library:2.1' 2.在Application中执行初始化操作 提示:在清单文件中注册Application public class MyApplication extends Application{ @Override public void onCreate() { super.onCreate(); //初始化二维码工具类 ZXingLibrary.initDisplayOpinion(this); } } 3.在清单文件配置权限(安卓6.0以上的手机还要额外的权限配置)。 <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" /> 4.在代码中执行打开扫描二维码界面操作  Intent intent = new Intent(MainActivity.this, CaptureActivity.class); startActivityForResult(intent, REQUEST_CODE); 这里的REQUEST_CODE是我们定义的int型常量,这里设置为5,为了方便接受onActivityResult分别进行处理。 5.在Activity的onActivityResult方法中接收扫描结果(下面有完整代码) protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == 5) { 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); 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(); } } } } 实现效果:(由于模拟器没有摄像头不能扫描二维码,手机录屏需要root,所以就截取了效果图) 第一张是进行二维码扫描,第二张是当扫描结束,显示信息。 只用区区几行代码,就可以实现二维码的快速扫描。 二、定制化显示扫描UI 1.在values的colors文件下添加颜色,决定了二维码四个边框的颜色 <color name="scan_corner_color">#0effc2</color>2. 2.在drawable文件下添加一个scan_image.png的图片,就是二维码扫描的那条横线 3.创建一个新的Activity(demo里叫 SecondActivity )集成FragmentActivity,在清单文件里进行配置。 4. 修改新的Activity布局文件,是二维码的背景布局 <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> 技术点:启动id为fl_my_container的FrameLayout就是我们需要替换的扫描组件,也就是说我们 会将我们定义的扫描Fragment替换到id为fl_my_container的FrameLayout的位置。 而上面的button是我们添加的一个额外的控件,在这里你可以添加任意的控件,各种UI效果等。 5. 创建my_camera.xml布局文件,这个就是扫描二维码的界面 要自定义二维码扫描页面,就在这个布局里进行修改,这里我加了一个ToolBar,一个Button按钮 用来退出扫描。 <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" /> <android.support.v7.widget.Toolbar android:background="#FF0000" android:layout_width="match_parent" android:layout_height="100dp"> </android.support.v7.widget.Toolbar> <com.uuzuche.lib_zxing.view.ViewfinderView android:id="@+id/viewfinder_view" android:layout_width="wrap_content" android:layout_height="wrap_content" app:inner_corner_color="@color/scan_corner_color" app:inner_corner_length="30dp" app:inner_corner_width="5dp" app:inner_height="200dp" app:inner_margintop="150dp" app:inner_scan_bitmap="@drawable/scan_image" app:inner_scan_iscircle="false" app:inner_scan_speed="10" app:inner_width="200dp" /> </FrameLayout> 6. 二维码解析回调函数,代码放到SecondActivity 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(); } }; 7.在Activity中执行Fragment的初始化操作 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); initView(); //在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(); } 8.使用Activity里定义的Button按钮,完成用户通过点击,退出二维码扫描界面的操作 //点击退出按钮就退出扫描二维码的界面 @Override public void onClick(View v) { switch (v.getId()) { case R.id.second_button1: finish(); break; } } 效果图: 完整代码(布局只有两个Button): MainActivity: /*使用二维码工具类步骤: * 1. 在module的build.gradle中dependencies添加:compile 'cn.yipianfengye.android:zxing-library:2.1' * 2. 在Application中执行二维码工具类的初始化操作 ZXingLibrary.initDisplayOpinion(this); * 3. 在清单文件配置权限和自定义的APPlication,安卓6.0的手机还要做额外的权限配置,方有效. * 3. 更加点击事件调用开启扫描二维码界面操作 * 4. 在自动接收跳转页面传过来的数据onActivityResult里接收扫描结果,并对结果进行处理 * */ public class MainActivity extends AppCompatActivity implements View.OnClickListener { private Button ZXing; private Button ZXingOK; private Button ZXingOK2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); } private void initView() { ZXing = (Button) findViewById(R.id.ZXing); ZXingOK = (Button) findViewById(R.id.ZXingOK); ZXing.setOnClickListener(this); ZXingOK.setOnClickListener(this); ZXingOK2 = (Button) findViewById(R.id.ZXingOK2); ZXingOK2.setOnClickListener(this); } //根据点击事件开启二维码扫描,这里的5是为了方便接受onActivityResult分别进行处理 @Override public void onClick(View v) { switch (v.getId()) { case R.id.ZXing: Intent intent = new Intent(MainActivity.this, CaptureActivity.class); startActivityForResult(intent, 5); break; case R.id.ZXingOK: Intent intent1 = new Intent(MainActivity.this, SecondActivity.class); startActivityForResult(intent1, 7); break; case R.id.ZXingOK2: Intent intent2 = new Intent(MainActivity.this, Main2Activity.class); startActivity(intent2); break; } } //在自动接收跳转页面传过来的数据OnActivityResult里接收扫描结果,并对结果进行处理 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { //处理二维码扫描的结果,5就是对在startActivityForResult里设置的标识进行判断,执行对应的逻辑 if (requestCode == 5) { //处理扫描结果(在界面上显示) 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); 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(); } } } if (requestCode == 7) { 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); 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(); } } } } } SecondActivity: /* 定制化显示扫描界面 * 1.在values的colors文件下添加颜色,决定了二维码四个边框的颜色 * 2.在drawable文件下添加一个scan_image.png的图片,决定了二维码扫描的那条横线的颜色 * 3.创建一个新的Activity(demo里叫 SecondActivity )集成FragmentActivity,在清单文件里进行配置. * 4.修改新的Activity布局文件,是二维码的背景布局 * 5.创建my_camera.xml布局文件,这个就是扫描二维码的界面 * 6.二维码解析回调函数,代码放到这个Activity即可(SecondActivity就在这个Activity名字) * 7.在Activity中执行Fragment的初始化操作 * 8.使用Activity里定义的Button按钮,完成用户通过点击,退出二维码扫描界面的操作. * 9.使用这个我们自定义的二维码扫描界面和使用默认的界面类似,只需替换CaptureActivity即可 */ public class SecondActivity extends AppCompatActivity implements View.OnClickListener { private Button second_button1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); initView(); //在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(); } private void initView() { second_button1 = (Button) findViewById(R.id.second_button1); second_button1.setOnClickListener(this); } //点击退出按钮就退出扫描二维码的界面 @Override public void onClick(View v) { switch (v.getId()) { case R.id.second_button1: finish(); break; } } //二维码解析回调函数,代码放到这个Activity即可(SecondActivity就在这个Activity名字) 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(); } }; } 三、生成二维码 只需要在点击事件中加入相应执行代码,即可完成效果: @Override public void onClick(View v) { switch (v.getId()) { //生成不带logo的二维码图片 case R.id.btnStart: String textContent = edShow.getText().toString(); if (TextUtils.isEmpty(textContent)) { Toast.makeText(Main2Activity.this, "您的输入为空!", Toast.LENGTH_SHORT).show(); return; } edShow.setText(""); Bitmap image = CodeUtils.createImage(textContent, 400, 400, null); imgShow.setImageBitmap(image); break; //生成带logo的二维码图片 case R.id.btnStart2: String textContent1 = edShow.getText().toString(); if (TextUtils.isEmpty(textContent1)) { Toast.makeText(Main2Activity.this, "您的输入为空!", Toast.LENGTH_SHORT).show(); return; } edShow.setText(""); Bitmap image1 = CodeUtils.createImage(textContent1, 400, 400, BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher)); imgShow.setImageBitmap(image1); break; } }