使用Zxing实现Android二维码扫描

news/2024/11/30 14:39:31/

现在市场上的很多Android应用具有二维码扫描的功能,本文将介绍如何将Zxing集成到自己的项目中实现二维码扫描的功能项目中使用的zxing版本是3.2.0应该是最新的,这里附上github上的zxing项目的链接(百度太让人无语了,搜zxing第一页搜索结果都没有这个)

https://github.com/zxing/zxing

Windows下载下来解压压缩包之后目录结构是这样的,如下图所示

关于各个目录功能的介绍都在README文档中,图中选中的三个目录是对我们有用的(实现二维码扫描而言),新建一个Android工程,将zxing android目录下的src中的源码拷到工程中,将android-core目录下的CameraConfigurationUtils.java类拷到工程中的camera目录下,将android目录下的res资源文件拷到或者合并到我们自己工程中相应的目录下(用于国际化的那些values文件不需要),在做完这些工作后工程目录应该是下面这样


libs下的core-3.2.0.jar就是zxing中的core部分打出的jar包,在android目录下的libs中,复制到项目中的libs下就行,不需要自己打包,然后按照android目录下的AndroidManifest.xml中的示例配置自己的工程,然后build自己的工程,这个时候会提示有很多错误,需要手动去改报错的类中的包引用(其他的错误可以根据problem中的error提示去修改)

做完以上的准备工作就可以在自己的MainActivity中调用二维码扫描的类了(布局文件比较简单,只有一个按钮和一个用于显示扫描结果的文本,这里不再给出代码),示例代码如下:

public class MainActivity extends Activity {public static final int SCAN_CODE = 1;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button button = (Button) findViewById(R.id.scan_button);button.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(MainActivity.this, CaptureActivity.class);startActivityForResult(intent, SCAN_CODE);}});}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {switch (requestCode) {case SCAN_CODE:TextView scanResult = (TextView) findViewById(R.id.scan_result);if (resultCode == RESULT_OK) {String result = data.getStringExtra("scan_result");scanResult.setText(result);} else if (resultCode == RESULT_CANCELED) {scanResult.setText("没有扫描出结果");}break;default:break;}}}
代码中可以看出我们是使用的startActivityForResult方法开启的扫描类CaptureActivity,接下来我们需要修改CaptureActivity中处理扫描结果的方法(删掉了Zxing用于自己处理扫描结果的方法,这里只作为示例使用),示例代码如下:

 public void handleDecode(Result rawResult, Bitmap barcode, float scaleFactor) {
//	playBeep();inactivityTimer.onActivity();lastResult = rawResult;if(rawResult!=null&&!rawResult.getText().equalsIgnoreCase("")){Intent intent =new Intent();intent.putExtra("scan_result", rawResult.getText());setResult(RESULT_OK, intent);}else{setResult(RESULT_CANCELED);}CaptureActivity.this.finish();
}

最后还需要在AndroidManifest.xml文件中声明权限以及涉及到的Activity,配置声明如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.ricky.qrcodesanner"android:versionCode="1"android:versionName="1.0" ><uses-permission android:name="android.permission.CAMERA" />  <uses-permission android:name="android.permission.INTERNET" />  <uses-permission android:name="android.permission.VIBRATE" />  <uses-permission android:name="android.permission.FLASHLIGHT" />  <uses-permission android:name="android.permission.READ_CONTACTS" />  <uses-permission android:name="com.android.browser.permission.READ_HISTORY_BOOKMARKS" />  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />  <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />  <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />  <uses-sdkandroid:minSdkVersion="14"android:targetSdkVersion="19" /><uses-feature  android:name="android.hardware.camera"  android:required="false" />  <uses-feature  android:name="android.hardware.camera.front"  android:required="false" />  <uses-feature  android:name="android.hardware.camera.autofocus"  android:required="false" />  <uses-feature  android:name="android.hardware.camera.flash"  android:required="false" />  <uses-feature android:name="android.hardware.screen.landscape" />  <uses-feature  android:name="android.hardware.wifi"  android:required="false" />  <uses-feature android:name="android.hardware.touchscreen" />  <supports-screens  android:anyDensity="true"  android:largeScreens="true"  android:normalScreens="true"  android:smallScreens="true"  android:xlargeScreens="true" /><applicationandroid:allowBackup="true"android:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme" ><activityandroid:name=".MainActivity"android:label="@string/app_name" ><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><activity  android:name="com.google.zxing.client.android.CaptureActivity"  android:clearTaskOnLaunch="true"  android:configChanges="orientation|keyboardHidden"  android:screenOrientation="landscape"  android:stateNotNeeded="true"  android:theme="@android:style/Theme.NoTitleBar.Fullscreen"  android:windowSoftInputMode="stateAlwaysHidden" >  <intent-filter>  <action android:name="com.google.zxing.client.android.SCAN" />  <category android:name="android.intent.category.DEFAULT" />  </intent-filter>  <intent-filter>  <action android:name="android.intent.action.VIEW" />  <category android:name="android.intent.category.DEFAULT" />  <category android:name="android.intent.category.BROWSABLE" />  <data  android:host="zxing.appspot.com"  android:path="/scan"  android:scheme="http" />  </intent-filter>  <intent-filter>  <action android:name="android.intent.action.VIEW" />  <category android:name="android.intent.category.DEFAULT" />  <category android:name="android.intent.category.BROWSABLE" />  <data  android:host="www.google.com"  android:path="/m/products/scan"  android:scheme="http" />  </intent-filter>  <intent-filter>  <action android:name="android.intent.action.VIEW" />  <category android:name="android.intent.category.DEFAULT" />  <category android:name="android.intent.category.BROWSABLE" />  <data  android:host="www.google.co.uk"  android:path="/m/products/scan"  android:scheme="http" />  </intent-filter>  <intent-filter>  <action android:name="android.intent.action.VIEW" />  <category android:name="android.intent.category.DEFAULT" />  <category android:name="android.intent.category.BROWSABLE" />  <data  android:host="scan"  android:path="/"  android:scheme="zxing" />  </intent-filter>  </activity>  <activity  android:name="com.google.zxing.client.android.PreferencesActivity"  android:label="@string/preferences_name"  android:stateNotNeeded="true" >  </activity>  <activity  android:name="com.google.zxing.client.android.encode.EncodeActivity"  android:stateNotNeeded="true" >  <intent-filter>  <action android:name="com.google.zxing.client.android.ENCODE" />  <category android:name="android.intent.category.DEFAULT" />  </intent-filter>  <intent-filter>  <action android:name="android.intent.action.SEND" />  <category android:name="android.intent.category.DEFAULT" />  <data android:mimeType="text/x-vcard" />  </intent-filter>  <intent-filter>  <action android:name="android.intent.action.SEND" />  <category android:name="android.intent.category.DEFAULT" />  <data android:mimeType="text/plain" />  </intent-filter>  </activity>  <activity  android:name="com.google.zxing.client.android.book.SearchBookContentsActivity"  android:configChanges="orientation|keyboardHidden"  android:label="@string/sbc_name"  android:screenOrientation="landscape"  android:stateNotNeeded="true" >  <intent-filter>  <action android:name="com.google.zxing.client.android.SEARCH_BOOK_CONTENTS" />  <category android:name="android.intent.category.DEFAULT" />  </intent-filter>  </activity>  <activity  android:name="com.google.zxing.client.android.share.ShareActivity"  android:screenOrientation="user"  android:stateNotNeeded="true"  android:theme="@android:style/Theme.Light" >  <intent-filter>  <action android:name="com.google.zxing.client.android.SHARE" />  <category android:name="android.intent.category.DEFAULT" />  </intent-filter>  </activity>  <activity  android:name="com.google.zxing.client.android.history.HistoryActivity"  android:label="@string/history_title"  android:stateNotNeeded="true" >  <intent-filter>  <action android:name="android.intent.action.VIEW" />  <category android:name="android.intent.category.DEFAULT" />  </intent-filter>  </activity>  <activity  android:name="com.google.zxing.client.android.share.BookmarkPickerActivity"  android:label="@string/bookmark_picker_name"  android:stateNotNeeded="true" >  <intent-filter>  <action android:name="android.intent.action.PICK" />  <category android:name="android.intent.category.DEFAULT" />  </intent-filter>  </activity>  <activity  android:name="com.google.zxing.client.android.share.AppPickerActivity"  android:configChanges="orientation"  android:label="@string/app_picker_name"  android:stateNotNeeded="true" >  <intent-filter>  <action android:name="android.intent.action.PICK" />  <category android:name="android.intent.category.DEFAULT" />  </intent-filter>  </activity>  <activity  android:name="com.google.zxing.client.android.HelpActivity"  android:screenOrientation="user" >  <intent-filter>  <action android:name="android.intent.action.VIEW" />  <category android:name="android.intent.category.DEFAULT" />  </intent-filter>  </activity>  </application></manifest>

至此就成功的使用zxing集成到自己的项目中实现二维码扫描的功能了,这里没有对二维码扫描的界面进行修改,所以看到的就是zxing项目提供的最初的扫描样式,其实除了横屏以外,其它的都挺好

其实如果只是用到二维码扫描的功能,项目中的一些类、资源以及xml中的声明配置有很多是多余的,我在另一篇博客中具体介绍了如何通过修改Zxing实现二维码的竖屏扫描,并且简要介绍了一下如果精简项目代码,有兴趣的朋友可以参考一下:对Zxing修改实现二维码竖屏扫描

点击此处下载源码

有什么问题或者心得欢迎交流!






http://www.ppmy.cn/news/420719.html

相关文章

Android 使用Zxing实现二维码的生成,扫描

在项目中要使用到二维码的相关内容,百度(原谅我还在用)之后得知一半都是使用Google的开源库 Zxing,但是网上多半的使用教程都是比较早的,这里给出我总结的一些基础代码和使用规则: 首先要一定要先去官网看看: github-Zxing官方库的地址 github-zxing-android-embedde…

使用ZXing扫码实现扫手机本地图片的二维码内容

ZXing这个第三方是我用的第三方&#xff0c;用来扫描二维码的&#xff0c;之前没有看到ZXing还提供了扫描本地图片二维码的功能&#xff0c;现在整理如下。 跳转到选取本地图片的页面 Intent intent new Intent(Intent.ACTION_GET_CONTENT);intent.setType("iamge/*&quo…

xamarin.forms 使用ZXing扫描二维码

1. Android工程包含ZXing.Net.Mobile.Forms 2. 在C# 工程中, 包含ZXing.Net.Mobile 3. 在Android工程的MainActivity.cs中, 添加下面代码: global::ZXing.Net.Mobile.Forms.Android.Platform.Init(); ZXing.Mobile.MobileBarcodeScanner.Initialize(this.Application); usin…

TC8:SOMEIPSRV_ONWIRE_01-12

SOMEIPSRV_ONWIRE_01: IP addresses and port number of the Reponse message 目的 检查SOME/IP响应消息的ip地址和port端口与请求消息匹配 测试步骤 DUT CONFIGURE:启动具有下列信息的服务 – Service ID:SERVICE-ID-1 – Instance数量:1Tester:客户端-1发送SOME/IP Noti…

Android ZXing 二维码、条形码扫描介绍

最近公司的Android项目需要用到摄像头做条码或二维码的扫描&#xff0c;Google一下&#xff0c;发现一个开源的 ZXing项目。它提供二维码和条形码的扫描。扫描条形码就是直接读取条形码的内容&#xff0c;扫描二维码是按照自己指定的二维码格式进行编码和解码。 1.什么是二维码…

Android 详解使用 Zxing实现前置摄像头扫描二维码、生成二维码

本文同步到简书 现在二维码使用越来越广泛了&#xff0c;几乎处处可见&#xff0c;并且 公司相关的项目中几乎全部都和二维码扫描有关&#xff0c;所以总结一下自己的使用心路历程&#xff0c;总觉得要做点什么来记录自己的成长&#xff0c;让自己的成长有迹可循&#xff0c;如…

Xamarin.Forms QR Code Scan 二维码扫描的Android App

环境配置 VS2017Xamarin.Forms .Net Standard 2.0 具体实现使用的是一个老项目了「ZXing.Net.Mobile」&#xff1a;https://github.com/Redth/ZXing.Net.Mobile 1. 新建项目 | QrCode3 & QrCode3.Android 新建项目如下图。&#xff08;iOS应用不进行开发&#xff0c;具…

实现手机扫描二维码进行登录

项目结构&#xff1a; 实现流程&#xff1a; pc端&#xff1a; 1:打开二维码登录网页index.html 2:index.html调用GetQrCodeServlet 3:GetQrCodeServlet干2件事 a:生成随机的uuid,是一个唯一标识&#xff0c;该标识贯穿整个流程 b:生成二维码图片&#xff0c;二维码信息&#x…