将 ZXing 库直接集成到我的 Android 应用程序中

我写这篇文章纯粹是出于绝望:)我被指派为一款 Android 1.6手机制作一个独立的条形码扫描器(作为概念验证)。

为此,我发现了 ZXing 图书馆。

我在 StackOverflow 上搜索、阅读了相关的主题,使用了常识等等。似乎没有什么帮助,我只是不能打孔这个精神封锁:/

我知道这是可能的,使用库,并创建自己的独立条形码扫描仪。我读到使用 Zxing 提供的“条形码扫描器”是目前为止最简单的解决方案(通过意图)。不幸的是,这不是一个选项,并且需要一个独立的应用程序。

总结一下我的问题:

  1. 如何通过 Eclipse 将 ZXing 源库集成到我的 Android 代码项目中?
  2. 当集成... 如何利用库,“加载”扫描功能?
  3. 步骤到步骤指南几乎是首选的,因为我刚开始在 Eclipse 中工作。

我尝试让我的代码项目依赖于来自 ZXing 源文件夹的 Android 文件夹。当我这样做时,出现了一些错误,主要是关于“ org.apache”(? ?)

我就是想不明白... 所以给点提示会很有帮助。

预付款,谢谢:)

161528 次浏览

你有没有看过在 zxing 网站上的 维基页面? 看起来你可能会发现 入门开发人员说明扫描很有帮助。

更新!-解决 + 指南

我已经设法弄明白了:)下面你可以阅读一步一步的指南,希望它能帮助其他人解决和我一样的问题;)

  1. 安装 ApacheAnt-(有关配置帮助,请参阅 YouTube 视频)
  2. 从 ZXing 主页下载 ZXing 源代码并对其进行解压缩
  3. 使用 Windows Commandline (Run-> CMD)导航到下载的 zxing src根目录。
  4. 在命令行窗口-键入 ant -f core/build.xml按回车键,让 Apache 工作它的魔力[ 有问题吗]
  5. 输入 Eclipse-> new Android Project,基于您刚提取的目录中的 Android 文件夹
  6. 右键单击项目文件夹-> 属性-> Java 构建路径-> 库-> 添加外部 JAR..。
  7. 导航到新解压缩的文件夹,打开核心目录并选择 core.jar... 点击回车!

现在你只需要纠正翻译和 AndroidManifest.xml 文件中的一些错误:)现在你可以高兴地编译,你现在将有一个工作的独立条形码扫描应用程序,基于 ZXing 源代码;)

快乐的编程人员-我希望它能帮助其他人:)

在构建 ANT 方面有问题吗? 请继续阅读

如果 ant -f core/build.xml 大概是这么说的:

Unable to locate tools.jar. Expected to find it in
C:\Program Files\Java\jre6\lib\tools.jar

然后将你的环境变量设置为正确的 java 文件夹:

C:\Program Files\Java\jdk1.6.0_21\lib

所以我把 JAVA_HOME设置为:

C:\Progra~1\Java\jdk1.6.0_25

我在一些网站上找到的短句法的原因是:

”我们强烈建议你 选择一个安装目录 不包括路径中的空格 名称(例如,不要安装在 C: 程序文件)。如果 Java 是 安装在这样的目录中,它是 对设置 JAVA _ HOME 至关重要 环境变量的道路 不包括空格(例如: C: 程序 ~ 1) ; 如果做不到这一点,就会失败 导致由某些 依赖于。的值的程序 JAVA _ Home”

然后重新启动 cmd (这很重要,因为 DOS shell 只在启动时读取 env var,所以更改 env var 将需要使用新的 shell 来获取更新的值)

最后 ant -f core/build.xml成功了。

Zxing 的家伙已经让创建一个1.7版本的 android 项目变得更加容易。不像以前那么痛苦了。这是一个快速博客,任何人谁想要创建一个 zxing 项目的 android 快速。

  • 查看 zxing.org 上的 zxing 源代码
  • 在您的 Eclipse 上创建一个 Android 项目
  • 删除 main.xml
  • 右键单击“ src”目录并点击 import。按照上述顺序浏览到下列目录。在逐个添加它们以进行导入时,请确保在导入向导的编辑字段中有 src 目录。并且您只选择左边目录树中的“ com”目录。不要选择 src。
  • Core
  • 机器人集成
  • 机器人
  • 确保您的 android sdk 版本是9,任何低于9的版本和 android 将哭泣。
  • 在其中一种语言中,Strings.xml 将会是 crib,只要在“字符”前面加上一个/即可

Zxing 1.7的 Android 项目(6月20日结账)。

Http://www.4shared.com/file/bfx8y5ys/zxingjune2010.html (不再有效了)

下面是一个关于如何使用 ZXing 库生成和显示二维码而不必安装第三方应用程序的分步指南。注:你不必用 ANT 或任何其他构建工具来构建 ZXing。文件 core.jar在已发布的压缩文件中可用(请参阅下文)。

  1. 下载 最新发布的 ZXing——(ZXing-*.zip)
  2. 解压缩这个压缩文件并在 core/目录下找到 core.jar
  3. 如果您正在使用 EclipseIDE,请将 core.jar拖放到 Android 项目的 libs目录中。当被问及时,选择 收到
  4. 将下面给出的两个类(Contents.javaQRCodeEncoder.java)复制到 Android 项目的主包中。
  5. 在你的活动中创建一个 ImageView项目来显示生成的二维码(如果你还没有的话)。下面是一个例子:
  6. 使用下面的代码片段生成位图格式的 QR 代码并以 ImageView显示。

下面是要添加到活动布局 XML 文件中的 ImageView元素:

<ImageView
android:id="@+id/qrCode"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="50dp"
android:layout_centerHorizontal="true"/>

代码片段:

// ImageView to display the QR code in.  This should be defined in
// your Activity's XML layout file
ImageView imageView = (ImageView) findViewById(R.id.qrCode);


String qrData = "Data I want to encode in QR code";
int qrCodeDimention = 500;


QRCodeEncoder qrCodeEncoder = new QRCodeEncoder(qrData, null,
Contents.Type.TEXT, BarcodeFormat.QR_CODE.toString(), qrCodeDimention);


try {
Bitmap bitmap = qrCodeEncoder.encodeAsBitmap();
imageView.setImageBitmap(bitmap);
} catch (WriterException e) {
e.printStackTrace();
}

这里是 Contents.java

//
// * 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.
//


import android.provider.ContactsContract;


public final class Contents {
private Contents() {
}


public static final class Type {


// Plain text. Use Intent.putExtra(DATA, string). This can be used for URLs too, but string
// must include "http://" or "https://".
public static final String TEXT = "TEXT_TYPE";


// An email type. Use Intent.putExtra(DATA, string) where string is the email address.
public static final String EMAIL = "EMAIL_TYPE";


// Use Intent.putExtra(DATA, string) where string is the phone number to call.
public static final String PHONE = "PHONE_TYPE";


// An SMS type. Use Intent.putExtra(DATA, string) where string is the number to SMS.
public static final String SMS = "SMS_TYPE";


public static final String CONTACT = "CONTACT_TYPE";


public static final String LOCATION = "LOCATION_TYPE";


private Type() {
}
}


public static final String URL_KEY = "URL_KEY";


public static final String NOTE_KEY = "NOTE_KEY";


// When using Type.CONTACT, these arrays provide the keys for adding or retrieving multiple phone numbers and addresses.
public static final String[] PHONE_KEYS = {
ContactsContract.Intents.Insert.PHONE, ContactsContract.Intents.Insert.SECONDARY_PHONE,
ContactsContract.Intents.Insert.TERTIARY_PHONE
};


public static final String[] PHONE_TYPE_KEYS = {
ContactsContract.Intents.Insert.PHONE_TYPE,
ContactsContract.Intents.Insert.SECONDARY_PHONE_TYPE,
ContactsContract.Intents.Insert.TERTIARY_PHONE_TYPE
};


public static final String[] EMAIL_KEYS = {
ContactsContract.Intents.Insert.EMAIL, ContactsContract.Intents.Insert.SECONDARY_EMAIL,
ContactsContract.Intents.Insert.TERTIARY_EMAIL
};


public static final String[] EMAIL_TYPE_KEYS = {
ContactsContract.Intents.Insert.EMAIL_TYPE,
ContactsContract.Intents.Insert.SECONDARY_EMAIL_TYPE,
ContactsContract.Intents.Insert.TERTIARY_EMAIL_TYPE
};
}

还有 QRCodeEncoder.java

/*
* 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.
*/


import android.provider.ContactsContract;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.telephony.PhoneNumberUtils;


import java.util.Collection;
import java.util.EnumMap;
import java.util.HashSet;
import java.util.Map;


import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;


public final class QRCodeEncoder {
private static final int WHITE = 0xFFFFFFFF;
private static final int BLACK = 0xFF000000;


private int dimension = Integer.MIN_VALUE;
private String contents = null;
private String displayContents = null;
private String title = null;
private BarcodeFormat format = null;
private boolean encoded = false;


public QRCodeEncoder(String data, Bundle bundle, String type, String format, int dimension) {
this.dimension = dimension;
encoded = encodeContents(data, bundle, type, format);
}


public String getContents() {
return contents;
}


public String getDisplayContents() {
return displayContents;
}


public String getTitle() {
return title;
}


private boolean encodeContents(String data, Bundle bundle, String type, String formatString) {
// Default to QR_CODE if no format given.
format = null;
if (formatString != null) {
try {
format = BarcodeFormat.valueOf(formatString);
} catch (IllegalArgumentException iae) {
// Ignore it then
}
}
if (format == null || format == BarcodeFormat.QR_CODE) {
this.format = BarcodeFormat.QR_CODE;
encodeQRCodeContents(data, bundle, type);
} else if (data != null && data.length() > 0) {
contents = data;
displayContents = data;
title = "Text";
}
return contents != null && contents.length() > 0;
}


private void encodeQRCodeContents(String data, Bundle bundle, String type) {
if (type.equals(Contents.Type.TEXT)) {
if (data != null && data.length() > 0) {
contents = data;
displayContents = data;
title = "Text";
}
} else if (type.equals(Contents.Type.EMAIL)) {
data = trim(data);
if (data != null) {
contents = "mailto:" + data;
displayContents = data;
title = "E-Mail";
}
} else if (type.equals(Contents.Type.PHONE)) {
data = trim(data);
if (data != null) {
contents = "tel:" + data;
displayContents = PhoneNumberUtils.formatNumber(data);
title = "Phone";
}
} else if (type.equals(Contents.Type.SMS)) {
data = trim(data);
if (data != null) {
contents = "sms:" + data;
displayContents = PhoneNumberUtils.formatNumber(data);
title = "SMS";
}
} else if (type.equals(Contents.Type.CONTACT)) {
if (bundle != null) {
StringBuilder newContents = new StringBuilder(100);
StringBuilder newDisplayContents = new StringBuilder(100);


newContents.append("MECARD:");


String name = trim(bundle.getString(ContactsContract.Intents.Insert.NAME));
if (name != null) {
newContents.append("N:").append(escapeMECARD(name)).append(';');
newDisplayContents.append(name);
}


String address = trim(bundle.getString(ContactsContract.Intents.Insert.POSTAL));
if (address != null) {
newContents.append("ADR:").append(escapeMECARD(address)).append(';');
newDisplayContents.append('\n').append(address);
}


Collection<String> uniquePhones = new HashSet<String>(Contents.PHONE_KEYS.length);
for (int x = 0; x < Contents.PHONE_KEYS.length; x++) {
String phone = trim(bundle.getString(Contents.PHONE_KEYS[x]));
if (phone != null) {
uniquePhones.add(phone);
}
}
for (String phone : uniquePhones) {
newContents.append("TEL:").append(escapeMECARD(phone)).append(';');
newDisplayContents.append('\n').append(PhoneNumberUtils.formatNumber(phone));
}


Collection<String> uniqueEmails = new HashSet<String>(Contents.EMAIL_KEYS.length);
for (int x = 0; x < Contents.EMAIL_KEYS.length; x++) {
String email = trim(bundle.getString(Contents.EMAIL_KEYS[x]));
if (email != null) {
uniqueEmails.add(email);
}
}
for (String email : uniqueEmails) {
newContents.append("EMAIL:").append(escapeMECARD(email)).append(';');
newDisplayContents.append('\n').append(email);
}


String url = trim(bundle.getString(Contents.URL_KEY));
if (url != null) {
// escapeMECARD(url) -> wrong escape e.g. http\://zxing.google.com
newContents.append("URL:").append(url).append(';');
newDisplayContents.append('\n').append(url);
}


String note = trim(bundle.getString(Contents.NOTE_KEY));
if (note != null) {
newContents.append("NOTE:").append(escapeMECARD(note)).append(';');
newDisplayContents.append('\n').append(note);
}


// Make sure we've encoded at least one field.
if (newDisplayContents.length() > 0) {
newContents.append(';');
contents = newContents.toString();
displayContents = newDisplayContents.toString();
title = "Contact";
} else {
contents = null;
displayContents = null;
}


}
} else if (type.equals(Contents.Type.LOCATION)) {
if (bundle != null) {
// These must use Bundle.getFloat(), not getDouble(), it's part of the API.
float latitude = bundle.getFloat("LAT", Float.MAX_VALUE);
float longitude = bundle.getFloat("LONG", Float.MAX_VALUE);
if (latitude != Float.MAX_VALUE && longitude != Float.MAX_VALUE) {
contents = "geo:" + latitude + ',' + longitude;
displayContents = latitude + "," + longitude;
title = "Location";
}
}
}
}


public Bitmap encodeAsBitmap() throws WriterException {
if (!encoded) return null;


Map<EncodeHintType, Object> hints = null;
String encoding = guessAppropriateEncoding(contents);
if (encoding != null) {
hints = new EnumMap<EncodeHintType, Object>(EncodeHintType.class);
hints.put(EncodeHintType.CHARACTER_SET, encoding);
}
MultiFormatWriter writer = new MultiFormatWriter();
BitMatrix result = writer.encode(contents, format, dimension, dimension, hints);
int width = result.getWidth();
int height = result.getHeight();
int[] pixels = new int[width * height];
// All are 0, or black, by default
for (int y = 0; y < height; y++) {
int offset = y * width;
for (int x = 0; x < width; x++) {
pixels[offset + x] = result.get(x, y) ? BLACK : WHITE;
}
}


Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
return bitmap;
}


private static String guessAppropriateEncoding(CharSequence contents) {
// Very crude at the moment
for (int i = 0; i < contents.length(); i++) {
if (contents.charAt(i) > 0xFF) { return "UTF-8"; }
}
return null;
}


private static String trim(String s) {
if (s == null) { return null; }
String result = s.trim();
return result.length() == 0 ? null : result;
}


private static String escapeMECARD(String input) {
if (input == null || (input.indexOf(':') < 0 && input.indexOf(';') < 0)) { return input; }
int length = input.length();
StringBuilder result = new StringBuilder(length);
for (int i = 0; i < length; i++) {
char c = input.charAt(i);
if (c == ':' || c == ';') {
result.append('\\');
}
result.append(c);
}
return result.toString();
}
}

如果只需要 zxing 的 core.jar,可以跳过这个过程,从 开始维基页面获得预构建的 JAR

最新的 ZXing (2.2)在 core 文件夹下没有 core.jar,但是您可以从 ZXing 这里是 Maven 仓库获得 core.jar

放下

compile 'com.google.zxing:core:2.3.0'

在使用 Android Studio 和 Gradle 构建系统之前,你可以把它们放到你的 Gradle 依赖项中。

由于有些答案已经过时,我想提供我自己的-

要像 他们的维基百科建议的那样将 ZXing 库集成到 Android 应用程序中,你需要在你的项目中添加2个 Java 文件:

然后在 安卓工作室中向 建造,分级文件添加以下代码行:

dependencies {
....
compile 'com.google.zxing:core:3.2.1'
}

或者如果仍然使用 带 ADT 插件的 Eclipse,将 Core.jar文件添加到项目的 Libs子目录(这里是 全屏幕视窗全屏 Mac) :

Windows screenshot

最后,将这段代码添加到 MainActivity.java:

public void scanQRCode(View v) {
IntentIntegrator integrator = new IntentIntegrator(MainActivity.this);
integrator.initiateScan(IntentIntegrator.QR_CODE_TYPES);
}


@Override
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
IntentResult result =
IntentIntegrator.parseActivityResult(requestCode, resultCode, intent);
if (result != null) {
String contents = result.getContents();
if (contents != null) {
showDialog(R.string.result_succeeded, result.toString());
} else {
showDialog(R.string.result_failed,
getString(R.string.result_failed_why));
}
}
}


private void showDialog(int title, CharSequence message) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(title);
builder.setMessage(message);
builder.setPositiveButton(R.string.ok_button, null);
builder.show();
}

生成的应用程序将要求安装并启动 条形码扫描器应用程序(它将在扫描后自动返回到您的应用程序) :

Barcode Scanner app

此外,如果你想构建和运行 ZXing Test 应用程序作为你自己的应用程序的灵感:

ZXing Test app

然后你需要4个来自 GitHub的 Java 文件:

  • BenchmarkActivity.java
  • BenchmarkAsyncTask.java
  • BenchmarkItem.java
  • Java

和3个来自 Maven 仓库的罐子文件:

  • Core.jar
  • Android-core. jar
  • Android 集成. jar

(您可以自己用 mvn package构建 Jar 文件-如果您从 GitHub 签出 ZXing 并在您的计算机上安装 蚂蚁Maven工具)。

注意: 如果您的项目不能识别 Jar 文件,您可能需要在 Project Properties 中提高 Java 版本:

properties screenshot

那个

compile 'com.google.zxing:core:2.3.0'

不幸的是,这招对我不管用。

这就是对我有效的方法:

dependencies {
compile 'com.journeyapps:zxing-android-embedded:3.0.1@aar'
compile 'com.google.zxing:core:3.2.0'
}

你可在此找到连结: Https://github.com/journeyapps/zxing-android-embedded

在 Eclipse 中一步一步地设置 zxing 3.2.1

  1. 从“ https://github.com/zxing/zxing”下载 zxing-master. zip
  2. 解压缩 zxing-master. zip,使用 eclipse 在 zxing-master 中导入“ android”项目
  3. 从“ http://repo1.maven.org/maven2/com/google/zxing/core/3.2.1/”下载 core-3.2.1.jar
  4. 在“ android”项目中创建“ libs”文件夹,并将 cor-3.2.1.jar 粘贴到 libs 文件夹中
  5. 点击 project: 选择“ properties”-> “ Java Compiler”将级别更改为1.7。然后点击“ Android”,将“ Project build target”更改为 Android 4.4.2 + ,因为使用1.7需要使用 Android 4.4进行编译
  6. 如果“ zxing-master/android/app/src/main/java/com/google/zxing/client/android/Camera/”中不存在“ CameraConfigurationUtils.java”,你可以从“ zxing-master/android-core/src/main/java/com/google/zxing/client/android/Camera/”中复制它并粘贴到你的项目中。
  7. 清洁和建设项目。如果您的项目显示关于“ switch-case”的错误,您应该将它们更改为“ If-else”。
  8. 完成。清洁和建设项目。
  9. 参考链接: 使用 ZXing 创建一个 Android 条形码扫描应用程序

我尝试了所有可能的方法来实现这一点,然后我发现了 JourneyApps 的 xZing 缩小版。我已经把它移植到 Eclipse 上并在 GitHub 上分享了。

如果您正在使用 Eclipse,请使用此项目:-

Https://github.com/hiteshsahu/xzing-barcode-scanner-minified-eclipse

如果您正在使用 Studio,请使用此项目:-

Https://github.com/journeyapps/zxing-android-embedded

优势

  1. 应用程序中的内置条形码扫描器不需要使用 playstore 安装第三方应用程序。

  2. 你不需要在核心,安卓客户端等罐子之间混淆,只需放下这个包和相关的布局在您的项目,你是好去。只有 Jar 需要的是 Zxing: core: 3.2.0 com.google.zxing: core: 3.2.0,您可以从中下载

    Http://mvnrepository.com/artifact/com.google.zxing/core/3.2.0

  3. 不需要添加成吨的软件包 参见下面的图片进行比较

以前:-

enter image description here

之后:-

enter image description here

  1. 最重要的是他们是 高度可定制即。您可以添加闪光灯,使用它的片段和支持方向的变化。

  2. 可以在 Cordova 应用中使用此捕获活动进行条形码扫描。

应用程序清单中的捕获活动如下所示

  <activity
android:name="com.journeyapps.barcodescanner.CaptureActivity"
android:clearTaskOnLaunch="true"
android:configChanges="orientation|keyboardHidden"
android:exported="false"
android:screenOrientation="fullSensor"
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>
</activity>

和插件将看起来像这样

public class BarcodeScanner extends CordovaPlugin {
public static final int REQUEST_CODE = 0x0ba7c0de;


private static final String SCAN = "scan";
private static final String CANCELLED = "cancelled";
private static final String FORMAT = "format";
private static final String TEXT = "text";
private static final String SCAN_INTENT = "com.google.zxing.client.android.SCAN";


private static final String LOG_TAG = "BarcodeScanner";


private CallbackContext callbackContext;


/**
* Constructor.
*/
public BarcodeScanner() {




}


/**
* Executes the request.
*
* This method is called from the WebView thread. To do a non-trivial amount of work, use:
*     cordova.getThreadPool().execute(runnable);
*
* To run on the UI thread, use:
*     cordova.getActivity().runOnUiThread(runnable);
*
* @param action          The action to execute.
* @param args            The exec() arguments.
* @param callbackContext The callback context used when calling back into JavaScript.
* @return                Whether the action was valid.
*
* @sa https://github.com/apache/cordova-android/blob/master/framework/src/org/apache/cordova/CordovaPlugin.java
*/
@Override
public boolean execute(String action, JSONArray args, CallbackContext callbackContext) {
this.callbackContext = callbackContext;
if (action.equals(SCAN)) {
scan(args);
} else {
return false;
}
return true;
}


/**
* Starts an intent to scan and decode a barcode.
*/
public void scan(JSONArray args) {
Intent intentScan = new Intent(SCAN_INTENT);
intentScan.addCategory(Intent.CATEGORY_DEFAULT);


// add config as intent extras
if(args.length() > 0) {


JSONObject obj;
JSONArray names;
String key;
Object value;


for(int i=0; i<args.length(); i++) {


try {
obj = args.getJSONObject(i);
} catch(JSONException e) {
Log.i("CordovaLog", e.getLocalizedMessage());
continue;
}


names = obj.names();
for(int j=0; j<names.length(); j++) {
try {
key = names.getString(j);
value = obj.get(key);


if(value instanceof Integer) {
intentScan.putExtra(key, (Integer)value);
} else if(value instanceof String) {
intentScan.putExtra(key, (String)value);
}


} catch(JSONException e) {
Log.i("CordovaLog", e.getLocalizedMessage());
continue;
}
}
}


}


// avoid calling other phonegap apps
intentScan.setPackage(this.cordova.getActivity().getApplicationContext().getPackageName());


this.cordova.startActivityForResult((CordovaPlugin) this, intentScan, REQUEST_CODE);
}


/**
* Called when the barcode scanner intent completes.
*
* @param requestCode The request code originally supplied to startActivityForResult(),
*                       allowing you to identify who this result came from.
* @param resultCode  The integer result code returned by the child activity through its setResult().
* @param intent      An Intent, which can return result data to the caller (various data can be attached to Intent "extras").
*/
@Override
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
if (requestCode == REQUEST_CODE) {
if (resultCode == Activity.RESULT_OK) {
JSONObject obj = new JSONObject();
try {
obj.put(TEXT, intent.getStringExtra("SCAN_RESULT"));
obj.put(FORMAT, intent.getStringExtra("SCAN_RESULT_FORMAT"));
obj.put(CANCELLED, false);
} catch (JSONException e) {
Log.d(LOG_TAG, "JSONException "+e.getMessage());
}
this.callbackContext.success(obj);
} else if (resultCode == Activity.RESULT_CANCELED) {
this.callbackContext.success("");
} else {
this.callbackContext.error("Technical Problem");
}
}
}
}

融合快乐! !

为什么使用外部库,当谷歌播放服务(自从版本 7.8.0)包括一个条形码解码器。

简单多了。

只需在应用程序级别的分级文件中包含依赖关系即可

compile 'com.journeyapps:zxing-android-embedded:3.0.1@aar'
compile 'com.google.zxing:core:3.2.0'

在 xml 文件中定义一个按钮,并在 OnCreate ()和按钮的 OnClick 监听器内部的 Java 文件中编写以下代码

new IntentIntegrator(this).initiateScan();

并在 Java 文件的 OnCreate ()之后编写以下代码

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
if(result != null) {
if(result.getContents() == null) {
Log.d("MainActivity", "Cancelled scan");
Toast.makeText(this, "Cancelled", Toast.LENGTH_LONG).show();
} else {
Log.d("MainActivity", "Scanned");
String st_scanned_result = result.getContents();
Toast.makeText(this, "Scanned: " + result.getContents(), Toast.LENGTH_LONG).show();


}
}


}

我最近在 ios 和 android 中都使用了谷歌移动视觉。我强烈推荐使用谷歌条形码扫描。它对任何方向都非常敏感,处理时间也非常快。它被称为谷歌移动视觉。

条形码扫描器 API 在任何情况下实时检测条形码 你也可以检测和解析一些条形码 不同的格式在同一时间。

Https://developers.google.com/vision/

Https://codelabs.developers.google.com/codelabs/bar-codes/#0

我只是写了一个方法,解码生成的条形码,BitmapString

它完全符合要求,只是没有 CaptureActivity..。

因此,可以跳过 build.gradle中的 android-integration库:

dependencies {
// https://mvnrepository.com/artifact/com.google.zxing
compile('com.google.zxing:core:3.3.0')
compile('com.google.zxing:android-core:3.3.0')
}

该方法如下(在 jUnit 测试中实际解码生成的条形码) :

import android.graphics.Bitmap;


import com.google.zxing.BinaryBitmap;
import com.google.zxing.LuminanceSource;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.NotFoundException;
import com.google.zxing.RGBLuminanceSource;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.Result;


protected String decode(Bitmap bitmap) {


MultiFormatReader reader = new MultiFormatReader();
String barcode = null;


int[] intArray = new int[bitmap.getWidth() * bitmap.getHeight()];
bitmap.getPixels(intArray, 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(), bitmap.getHeight());
LuminanceSource source = new RGBLuminanceSource(bitmap.getWidth(), bitmap.getHeight(), intArray);
BinaryBitmap binary = new BinaryBitmap(new HybridBinarizer(source));


try {


Result result = reader.decode(binary);
// BarcodeFormat format = result.getBarcodeFormat();
// ResultPoint[] points = result.getResultPoints();
// byte[] bytes = result.getRawBytes();
barcode = result.getText();


} catch (NotFoundException e) {
e.printStackTrace();
}
return barcode;
}

这个库工作起来很有魅力,易于集成和使用

2020年更新: 只要把这个添加到你的格拉德尔文件。它完美地工作!

repositories {
jcenter()
}
implementation 'me.dm7.barcodescanner:zxing:1.9.13'