Android实现基于ZXing快速集成二维码扫描功能

二维码扫描现在是一直比较多的应用场景,android的开源项目ZXing提供了完整、成熟的解决方案,如果仅仅是出于快速开发的目的,可以根据自己的项目需要,把ZXing官方提供的项目稍加裁剪,就可以快速的集成到自己的项目中。下面详细演示和介绍如何实现基于ZXing官方提供的源码,快速集成二维码扫描功能到自己项目中的解决方案。

(第1步):到ZXing官方主页下载最新的项目代码包,ZXing在github的官方主页:https://github.com/zxing,下载后解压。解压后根目录下有若干项目目录,其中的:android就是我们需要的项目,把它导入到Eclispse中。

(第2步):ZXing的Android项目需要引用两个关键的库文件:android-core-x.x.x.jarcore-x.x.x.jar,其中x.x.x表示版本号。截止发表本博文时候,版本已经是3.2.0了。这两个关键的android-core-x.x.x.jar 和 core-x.x.x.jar 文件,实际上都可以从第一步下载得到的源代码中自己编译生成,网上也有编译的具体方案,但简单期间,也可以从ZXing的官方直接下载已经编译好的文件,其中android-core的下载链接是:http://repo1.maven.org/maven2/com/google/zxing/android-core/,另外一个ZXing的core下载链接是:http://repo1.maven.org/maven2/com/google/zxing/core/ ,选择最新版本的库文件或者自己需要的版本号,下载后,和其他android项目中导入库文件类似,导入到Android项目中的libs目录下,如果没有libs,新建一个名为libs的目录,把两个库文件放进去即可。

(第3步):这一步作为演示,我们自己新建一个MainActiviy,作为项目的启动器Activity,App将启动我们自己的MainActivity。观察ZXing官方提供的AndroidManifest.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<!--
 Copyright (C) 2008 ZXing authors

 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
 You may obtain a copy of the License at

  http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
 -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.google.zxing.client.android"
   android:versionName="4.7.3"
   android:versionCode="103"
   android:installLocation="auto">

 <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-sdk android:minSdkVersion="15" android:targetSdkVersion="21"/>

 <!-- Don't require camera, as this requires a rear camera. This allows it to work on the Nexus 7 -->
 <uses-feature android:name="android.hardware.camera" android:required="false"/>
 <uses-feature android:name="android.hardware.camera.front" android:required="false"/>
 <!-- TODO replace above two with next line after Android 4.2 -->
 <!-- <uses-feature android:name="android.hardware.camera.any"/> -->
 <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"/>
 <!-- This excludes Google TV, which is unfortunately included by virtue of not requiring a camera -->
 <uses-feature android:name="android.hardware.touchscreen"/>
 <!-- TODO make this not required again after android.hardware.camera.any is available -->

 <supports-screens android:xlargeScreens="true"
     android:largeScreens="true"
     android:normalScreens="true"
     android:smallScreens="true"
     android:anyDensity="true"/>

 <application android:icon="@drawable/launcher_icon"
    android:logo="@drawable/launcher_icon"
    android:label="@string/app_name"
    android:allowBackup="true">
 <activity android:name=".CaptureActivity"
    android:screenOrientation="sensorLandscape"
    android:clearTaskOnLaunch="true"
    android:stateNotNeeded="true"
    android:theme="@style/CaptureTheme"
    android:windowSoftInputMode="stateAlwaysHidden">
  <intent-filter>
  <action android:name="android.intent.action.MAIN"/>
  <category android:name="android.intent.category.LAUNCHER"/>
  </intent-filter>
  <intent-filter>
  <action android:name="com.google.zxing.client.android.SCAN"/>
  <category android:name="android.intent.category.DEFAULT"/>
  </intent-filter>
  <!-- Allow web apps to launch Barcode Scanner by linking to http://zxing.appspot.com/scan. -->
  <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:scheme="http" android:host="zxing.appspot.com" android:path="/scan"/>
  </intent-filter>
  <!-- We also support a Google Product Search URL. -->
  <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:scheme="http" android:host="www.google.com" android:path="/m/products/scan"/>
  </intent-filter>
  <!-- And the UK version. -->
  <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:scheme="http" android:host="www.google.co.uk" android:path="/m/products/scan"/>
  </intent-filter>
  <!-- Support zxing://scan/?... like iPhone app -->
  <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:scheme="zxing" android:host="scan" android:path="/"/>
  </intent-filter>
 </activity>
 <activity android:name=".PreferencesActivity"
    android:label="@string/preferences_name"
    android:stateNotNeeded="true"/>
 <activity android:name=".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>
  <!-- This allows us to handle the Share button in Contacts. -->
  <intent-filter>
  <action android:name="android.intent.action.SEND"/>
  <category android:name="android.intent.category.DEFAULT"/>
  <data android:mimeType="text/x-vcard"/>
  </intent-filter>
  <!-- This allows us to handle sharing any plain text . -->
  <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=".book.SearchBookContentsActivity"
    android:label="@string/sbc_name"
    android:stateNotNeeded="true"
    android:screenOrientation="sensorLandscape">
  <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=".share.ShareActivity"
    android:stateNotNeeded="true"
    android:screenOrientation="user">
  <intent-filter>
  <action android:name="com.google.zxing.client.android.SHARE"/>
  <category android:name="android.intent.category.DEFAULT"/>
  </intent-filter>
 </activity>
 <activity android:name=".history.HistoryActivity"
    android:label="@string/history_title"
    android:stateNotNeeded="true"/>
 <activity android:name=".share.BookmarkPickerActivity"
    android:label="@string/bookmark_picker_name"
    android:stateNotNeeded="true"/>
 <activity android:name=".share.AppPickerActivity"
    android:label="@string/app_picker_name"
    android:stateNotNeeded="true"/>
 <activity android:name=".HelpActivity"
    android:label="@string/menu_help"
    android:screenOrientation="user"
    android:stateNotNeeded="true"/>
 </application>

</manifest>

其实ZXing官方的项目已经作为为第三方提供集成的代码了,比如其中的关键Activity:.\src\com\google\zxing\client\android\CaptureActivity.Java,在声明中已经提供好了从各种入口访问的Intent的Action。所以在我们自己新建的MainActivity中,直接隐式指定一个Intent的Action,启动之即可:

package com.google.zxing.client.android;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Toast;

public class MainActivity extends Activity {

 private final int REQUEST_CODE = 0xa1;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);

 Intent intent = new Intent();
 //隐式指定
 intent.setAction("com.google.zxing.client.android.SCAN");

 //启动ZXing已经写好、且我们做小量修改后的CaptureActivity。
 startActivityForResult(intent, REQUEST_CODE);
 }

 @Override
 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
 super.onActivityResult(requestCode, resultCode, data);

 //我们需要的结果返回
 if (requestCode == REQUEST_CODE && resultCode == Activity.RESULT_OK) {

 //result就是二维码扫描的结果。
 String result = data.getStringExtra("RESULT");

 Toast.makeText(getApplicationContext(), result, Toast.LENGTH_SHORT)
  .show();
 }
 }
}

因为我们启动ZXing的CaptureActivity不是目的,真正的目的是启动ZXing的CaptureActivity获得二维码扫描结果,因此以startActivityForResult()的方式启动。相应的,我们需要重写:protected void onActivityResult(int requestCode, int resultCode, Intent data),以回调等待传回结果。

(第4步):这一步是重点。在.\src\com\google\zxing\client\android\目录下的CaptureActivity.java中的方法: public void handleDecode(Result rawResult, Bitmap barcode, float scaleFactor);此方法是一个回调函数。ZXing项目中写好的扫描模块扫描后返回回调此方法,ZXing官方的原始 public void handleDecode(Result rawResult, Bitmap barcode, float scaleFactor)方法是这样的:

/**
 * A valid barcode has been found, so give an indication of success and show the results.
 *
 * @param rawResult The contents of the barcode.
 * @param scaleFactor amount by which thumbnail was scaled
 * @param barcode A greyscale bitmap of the camera data which was decoded.
 */
 public void handleDecode(Result rawResult, Bitmap barcode, float scaleFactor) {
 inactivityTimer.onActivity();
 lastResult = rawResult;
 ResultHandler resultHandler = ResultHandlerFactory.makeResultHandler(this, rawResult);

 boolean fromLiveScan = barcode != null;
 if (fromLiveScan) {
  historyManager.addHistoryItem(rawResult, resultHandler);
  // Then not from history, so beep/vibrate and we have an image to draw on
  beepManager.playBeepSoundAndVibrate();
  drawResultPoints(barcode, scaleFactor, rawResult);
 }

 switch (source) {
  case NATIVE_APP_INTENT:
  case PRODUCT_SEARCH_LINK:
  handleDecodeExternally(rawResult, resultHandler, barcode);
  break;
  case ZXING_LINK:
  if (scanFromWebPageManager == null || !scanFromWebPageManager.isScanFromWebPage()) {
   handleDecodeInternally(rawResult, resultHandler, barcode);
  } else {
   handleDecodeExternally(rawResult, resultHandler, barcode);
  }
  break;
  case NONE:
  SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
  if (fromLiveScan && prefs.getBoolean(PreferencesActivity.KEY_BULK_MODE, false)) {
   Toast.makeText(getApplicationContext(),
       getResources().getString(R.string.msg_bulk_mode_scanned) + " (" + rawResult.getText() + ')',
       Toast.LENGTH_SHORT).show();
   // Wait a moment or else it will scan the same barcode continuously about 3 times
   restartPreviewAfterDelay(BULK_MODE_SCAN_DELAY_MS);
  } else {
   handleDecodeInternally(rawResult, resultHandler, barcode);
  }
  break;
 }
 }

我们将精简此方法,定制自己所需要的内容,为满足我们自己项目中的需求,把此方法修改后的代码为:

 public void handleDecode(Result rawResult, Bitmap barcode, float scaleFactor) {
 inactivityTimer.onActivity();
 lastResult = rawResult;
 ResultHandler resultHandler = ResultHandlerFactory.makeResultHandler(this, rawResult);

 boolean fromLiveScan = barcode != null;
 if (fromLiveScan) {
  historyManager.addHistoryItem(rawResult, resultHandler);
  // Then not from history, so beep/vibrate and we have an image to draw on
  beepManager.playBeepSoundAndVibrate();
  drawResultPoints(barcode, scaleFactor, rawResult);
 }

 //在这里增加我们的代码,目的是:做最小量的修改,仅仅把ZXing提供的CaptureActivity作为一个中间使用的Activity集成到我们自己的项目。
 //启动实现二维码扫描,返回一个结果就可以了。
 //然后结束这个Activity。
 Intent intent=new Intent();
 //<key,value>形式存储二维码结果。
 //rawResult.getText()即为二维码结果。
 intent.putExtra("RESULT", rawResult.getText());
 this.setResult(Activity.RESULT_OK, intent);
 this.finish();

 /**
 以下是ZXing提供的源码,根据项目需要可以删减使用。
 简单期间,我们只需要二维码扫描后返回一个扫描的字符串结果。
 所以在次暂时注释掉。

 switch (source) {
  case NATIVE_APP_INTENT:
  case PRODUCT_SEARCH_LINK:
  handleDecodeExternally(rawResult, resultHandler, barcode);
  break;
  case ZXING_LINK:
  if (scanFromWebPageManager == null || !scanFromWebPageManager.isScanFromWebPage()) {
   handleDecodeInternally(rawResult, resultHandler, barcode);
  } else {
   handleDecodeExternally(rawResult, resultHandler, barcode);
  }
  break;
  case NONE:
  SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
  if (fromLiveScan && prefs.getBoolean(PreferencesActivity.KEY_BULK_MODE, false)) {
   Toast.makeText(getApplicationContext(),
       getResources().getString(R.string.msg_bulk_mode_scanned) + " (" + rawResult.getText() + ')',
       Toast.LENGTH_SHORT).show();
   // Wait a moment or else it will scan the same barcode continuously about 3 times
   restartPreviewAfterDelay(BULK_MODE_SCAN_DELAY_MS);
  } else {
   handleDecodeInternally(rawResult, resultHandler, barcode);
  }
  break;
 }

 **/
 }

 (第5步):这一步比较简单,是剩余的收尾工作,修改AndroidManifest.xml文件,把我们的MainActivity作为主Activity启动。把ZXing的CaptureActivity作为一个普通的Activity。

修改后的AndroidManifest.xml文件:

 <?xml version="1.0" encoding="UTF-8"?>
<!--
 Copyright (C) 2008 ZXing authors

 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
 You may obtain a copy of the License at

  http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
 -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.google.zxing.client.android"
   android:versionName="4.7.3"
   android:versionCode="103"
   android:installLocation="auto">

 <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-sdk android:minSdkVersion="15" android:targetSdkVersion="21"/>

 <!-- Don't require camera, as this requires a rear camera. This allows it to work on the Nexus 7 -->
 <uses-feature android:name="android.hardware.camera" android:required="false"/>
 <uses-feature android:name="android.hardware.camera.front" android:required="false"/>
 <!-- TODO replace above two with next line after Android 4.2 -->
 <!-- <uses-feature android:name="android.hardware.camera.any"/> -->
 <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"/>
 <!-- This excludes Google TV, which is unfortunately included by virtue of not requiring a camera -->
 <uses-feature android:name="android.hardware.touchscreen"/>
 <!-- TODO make this not required again after android.hardware.camera.any is available -->

 <supports-screens android:xlargeScreens="true"
     android:largeScreens="true"
     android:normalScreens="true"
     android:smallScreens="true"
     android:anyDensity="true"/>

 <application android:icon="@drawable/launcher_icon"
    android:logo="@drawable/launcher_icon"
    android:label="@string/app_name"
    android:allowBackup="true">

 <!-- 新增的我们自己的MainActiviy作为启动Activity -->
 <activity
   android: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=".CaptureActivity"
    android:screenOrientation="sensorLandscape"
    android:clearTaskOnLaunch="true"
    android:stateNotNeeded="true"
    android:theme="@style/CaptureTheme"
    android:windowSoftInputMode="stateAlwaysHidden">

  <!--
  把ZXing官方提供的作为 main activity启动的CaptureActivity作为一个普通Activiy。

  <intent-filter>
  <action android:name="android.intent.action.MAIN"/>
  <category android:name="android.intent.category.LAUNCHER"/>
  </intent-filter>

  --> 

  <intent-filter>
  <action android:name="com.google.zxing.client.android.SCAN"/>
  <category android:name="android.intent.category.DEFAULT"/>
  </intent-filter>
  <!-- Allow web apps to launch Barcode Scanner by linking to http://zxing.appspot.com/scan. -->
  <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:scheme="http" android:host="zxing.appspot.com" android:path="/scan"/>
  </intent-filter>
  <!-- We also support a Google Product Search URL. -->
  <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:scheme="http" android:host="www.google.com" android:path="/m/products/scan"/>
  </intent-filter>
  <!-- And the UK version. -->
  <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:scheme="http" android:host="www.google.co.uk" android:path="/m/products/scan"/>
  </intent-filter>
  <!-- Support zxing://scan/?... like iPhone app -->
  <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:scheme="zxing" android:host="scan" android:path="/"/>
  </intent-filter>
 </activity>
 <activity android:name=".PreferencesActivity"
    android:label="@string/preferences_name"
    android:stateNotNeeded="true"/>
 <activity android:name=".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>
  <!-- This allows us to handle the Share button in Contacts. -->
  <intent-filter>
  <action android:name="android.intent.action.SEND"/>
  <category android:name="android.intent.category.DEFAULT"/>
  <data android:mimeType="text/x-vcard"/>
  </intent-filter>
  <!-- This allows us to handle sharing any plain text . -->
  <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=".book.SearchBookContentsActivity"
    android:label="@string/sbc_name"
    android:stateNotNeeded="true"
    android:screenOrientation="sensorLandscape">
  <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=".share.ShareActivity"
    android:stateNotNeeded="true"
    android:screenOrientation="user">
  <intent-filter>
  <action android:name="com.google.zxing.client.android.SHARE"/>
  <category android:name="android.intent.category.DEFAULT"/>
  </intent-filter>
 </activity>
 <activity android:name=".history.HistoryActivity"
    android:label="@string/history_title"
    android:stateNotNeeded="true"/>
 <activity android:name=".share.BookmarkPickerActivity"
    android:label="@string/bookmark_picker_name"
    android:stateNotNeeded="true"/>
 <activity android:name=".share.AppPickerActivity"
    android:label="@string/app_picker_name"
    android:stateNotNeeded="true"/>
 <activity android:name=".HelpActivity"
    android:label="@string/menu_help"
    android:screenOrientation="user"
    android:stateNotNeeded="true"/>
 </application>

</manifest>

备注:此文仅仅是最简单的一个示例,演示了如何在自己的项目中在ZXing官方项目已提供的完整代码基础上,做最小量的改动,将二维码扫描功能快速集成到自己的项目中为我所用,若需要更多的细节调整,则需要深入定制和改编源代码。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android中的二维码生成与扫描功能

    0. 前言 今天这篇文章主要描述二维码的生成与扫描,使用目前流行的Zxing,为什么要讲二维码,因为二维码太普遍了,随便一个Android APP都会有二维码扫描.本篇旨在帮助有需求的同学快速完成二维码生成和扫描的功能. 1.    Zxing的使用 从github上下载项目后,可以看到整体代码结构如下: 我们只需将Zxing包下的所有代码copy一份到我们的项目中去,除了这些还需要zxing的jar包,最后相应的资源文件,包括values文件下的ids文件.raw文件中的资源文件(可以替换).

  • Android基于zxing的二维码(网格)扫描 仿支付宝网格扫描

    前言:对于二维码扫描我们使用的是开源框架Zxing或者Zbar,这里使用基于zxing的二维码扫描,类似支付宝网格扫描. 二维码原理介绍: 二维码是用某种特定的几何图形按一定的规律在平面上分布的黑白相间的图形记录数据符号信息的,在代码编制上巧妙的利用构成计算机内部逻辑基础的0/1比特流的概念,使用若干个与二进制相对应的几何形体来表示文字数值信息,通过图像输入设备或光电扫描设备自动识读以实现信息自动处理:二维码能够在横向和纵向两个方位同时表达信息,因此能在很小的面积内表达大量的信息. 效果: 真机

  • Android开发框架之自定义ZXing二维码扫描界面并解决取景框拉伸问题

    先给大家展示下效果图: 扫描内容是下面这张,二维码是用zxing库生成的 由于改了好几个类,还是去年的事都忘得差不多了,所以只能上这个类的代码了,主要就是改了这个CaptureActivity.java package com.zxing.activity; import java.io.IOException; import java.util.Vector; import android.app.Activity; import android.content.Intent; import

  • Android实现二维码扫描并登陆网页

    之前写过一个二维码扫描demo,用的Zxing的框架,点击下载,后续扫描二维码中出现一些问题,比如解决压缩图片,调整扫描窗口大小等等.后续单位要求做扫描登录实现,发现难点就是怎么知道你扫描的是这台电脑,后台必须获取到(后台技术的问题)然后把这个参数给我,再传递到后台,后台判断登录即可.这样自己扫描后直接传递个参数就可以实现登录了. 效果如下: 大概代码实现:扫描跳转: //扫描登录a case R.id.tv_more_qr: if (PventQuickClick.isFastDoubleCl

  • Android实现二维码扫描和生成的简单方法

    这里简单介绍一下ZXing库.ZXing是一个开放源码的,用Java实现的多种格式的1D/2D条码图像处理库,它包含了联系到其他语言的端口.Zxing可以实现使用手机的内置的摄像头完成条形码的扫描及解码.该项目可实现的条形码编码和解码.目前支持以下格式:UPC-A,UPC-E.EAN-8,EAN-13.39码.93码.ZXing是个很经典的条码/二维码识别的开源类库,以前在功能机上,就有开发者使用J2ME运用ZXing了,不过要支持JSR-234规范(自动对焦)的手机才能发挥其威力. ZXing

  • Android中二维码的生成方法(普通二维码、中心Logo 二维码、及扫描解析二维码)

    首先声明我们通篇用的都是Google开源框架Zxing,要实现的功能有三个 ,生成普通二维码.生成带有中心图片Logo 的二维码,扫描解析二维码,直接上效果图吧 首先我们需要一个这样的 Zxing 的包类似于这样 接下来需要引入资源 1.drawable 中引入图片 navbar.png 2.layout中引入camera.xml.main.xml.qrcode_capture_page.xml 3.创建raw文件夹并添加beep.ogg 扫描声音 4.合并color.xml,copy ids.

  • Android基于google Zxing实现各类二维码扫描效果

    随着微信的到来,二维码越来越火爆,随处能看到二维码,比如商城里面,肯德基,餐厅等等,对于二维码扫描我们使用的是google的开源框架Zxing,我们可以去http://code.google.com/p/zxing/下载源码和Jar包,之前我项目中的二维码扫描功能只实现了扫描功能,其UI真的是其丑无比,一个好的应用软件,其UI界面也要被大众所接纳,不然人家就不会用你的软件啦,所以说应用软件功能和界面一样都很重要,例如微信,相信微信UI被很多应用软件所模仿,我也仿照微信扫描二维码效果进行模仿,虽然

  • Android-Zxing实现二维码的扫描与生成

    Zxing: Zxing是一个开放源码,用java实现的多种格式的1D/2D条码图像处理库,它包含了联系到其他语言的端口.可以实现使用手机内置摄像头完成条形码的扫描以及解码. github: https://github.com/zxing/zxing 首先在写项目的时候,我们需要导入一个moduel,主要是从Zxing中提取的主要功能代码.其地址是: http://pan.baidu.com/s/1sk9pGmT 扫描二维码: 在点击扫描二维码的页面: startActivityForResu

  • Android利用ZXing扫描二维码的实例代码解析

    相关阅读: Android开发框架之自定义ZXing二维码扫描界面并解决取景框拉伸问题 此项目源码地址:请点击这里 看一下zxing的项目结构,我这里直接拿过来用的 看一下扫码的activity: package com.fanyafeng.barcode.activity; import android.content.Intent; import android.graphics.Bitmap; import android.net.Uri; import android.os.Bundle

  • Android平台生成二维码并实现扫描 & 识别功能

    1.二维码的前世今生 "二维条码/二维码(2-dimensional bar code)是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的:在代码编制上巧妙地利用构成计算机内部逻辑基础的"0"."1"比特流的概念,使用若干个与二进制相对应的几何形体来表示文字数值信息,通过图象输入设备或光电扫描设备自动识读以实现信息自动处理:它具有条码技术的一些共性:每种码制有其特定的字符集:每个字符占有一定的宽度:具有一定的校验功能

  • Android开发实现模仿360二维码扫描功能实例详解

    本文实例讲述了Android开发实现模仿360二维码扫描功能的方法.分享给大家供大家参考,具体如下: 一.效果图: 二.框架搭建 1.首先,下载最新zxing开源项目. 下载地址:http://code.google.com/p/zxing/ 或 点击此处本站下载. 2.分析项目结构,明确扫描框架需求.在zxing中,有很多其他的功能,项目结构比较复杂:针对二维码QRCode扫描,我们需要几个包: (1)com.google.zxing.client.android.Camera 基于Camer

  • Android 基于google Zxing实现二维码、条形码扫描,仿微信二维码扫描效果(推荐)

    了解二维码这个东西还是从微信中,当时微信推出二维码扫描功能,自己感觉挺新颖的,从一张图片中扫一下竟然能直接加好友,不可思议啊,那时候还不了解二维码,呵呵,然后做项目的时候,老板说要加上二维码扫描功能,然后自己的屁颠屁颠的去百度,google啥的,发现很多朋友都有介绍二维码扫描的功能,然后我就跟着人家的介绍自己搞起了二维码扫描功能,跟着人家的帖子,很快我的项目就加入了扫描二维码的功能,然后自己还很开心. 随着微信的到来,二维码越来越火爆,随处能看到二维码,比如商城里面,肯德基,餐厅等等,对于二维码

随机推荐