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

时间:2011-01-24 13:29:24

标签: android barcode barcode-scanner zxing

我只是在绝望中写这篇文章:)我被指派为Android 1.6手机制作一个独立的条码扫描器(作为概念证明)。

为此,我发现了ZXing库。

我用谷歌搜索,在StackOverflow上阅读相关主题,使用常见等等。似乎没有任何帮助,我只是不能在这个封锁上打个洞:/

我知道可以使用lib,并创建自己的独立条形码扫描仪。我读过使用Zxing人提供的“条码扫描器”,这是迄今为止最简单的解决方案(通过Intent)。不幸的是,这不是一个选项,需要一个独立的应用程序。

总结我的问题:

  1. 如何通过Eclipse将ZXing源库集成到我的Android代码项目中?
  2. 集成时...如何利用lib,“加载”扫描功能?
  3. 步骤指南几乎是首选,因为我刚开始在Eclipse中工作。
  4. 我试图让我的代码项目依赖于ZXing源文件夹中的Android文件夹。当我这样做时,会出现一些错误,主要涉及'org.apache'(??)

    我无法理解......所以一些提示最有帮助。

    提前,谢谢:)

17 个答案:

答案 0 :(得分:125)

更新! - 已解决+指南

我已经设法解决了:)在下面你可以阅读分步指南,所以它希望可以帮助其他人解决与我相同的问题;)

  1. 安装Apache Ant - (See this YouTube video for config help
  2. 从ZXing主页下载ZXing源并将其解压缩
  3. 使用Windows命令行(Run-> CMD)导航到下载的zxing src的根目录。
  4. 在命令行窗口中 - 输入ant -f core/build.xml按回车键让Apache发挥其魔力[ having issues? ]
  5. 输入Eclipse - >新的Android项目,基于你刚解压缩的目录中的android文件夹
  6. 右键单击项目文件夹 - >属性 - > Java构建路径 - >图书馆 - >添加外部JAR ......
  7. 导航到新解压缩的文件夹并打开核心目录,然后选择core.jar ...按Enter键!
  8. 现在您只需更正翻译和AndroidManifest.xml文件中的一些错误:)现在您可以愉快地编译,现在您将拥有一个基于ZXing源的独立条码扫描器应用程序;)

    快乐的编码人 - 我希望它能帮助别人:)

答案 1 :(得分:80)

以下是如何使用ZXing库生成和显示QR码的分步指南,无需安装第三方应用程序。 注意:您不必使用ANT或任何其他构建工具构建ZXing。文件core.jar在已发布的zip存档中可用(如下所示)。

  1. 下载latest release of ZXing。 - (ZXing-*.zip
  2. 解压缩此zip存档并在core.jar目录下找到core/
  3. 如果您使用的是Eclipse IDE,请将core.jar拖放到Android项目的libs目录中。系统询问时,选择复制
  4. 将以下两个类(Contents.java& QRCodeEncoder.java)复制到Android项目的主程序包中。
  5. 如果您还没有生成的二维码,请在活动中创建一个ImageView项目以显示生成的二维码。下面给出一个例子:
  6. 使用下面的代码段以位图格式生成QR码,并将其显示在ImageView
  7. 以下是要添加到Activity布局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();
        }
    }
    

答案 2 :(得分:15)

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

答案 3 :(得分:11)

使用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_HOME环境变量设置为正确的java文件夹。我在我的(Windows)中找到了tools.jar:

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

所以我将JAVA_HOME设置为:

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

我在某个网站上发现的语法较短的原因是:

  

“强烈建议你   选择一个安装目录   路径中不包含空格   名称(例如,不要安装在   C:\ Program Files)。如果是Java   安装在这样的目录中,它是   设置JAVA_HOME至关重要   环境变量到一个路径   不包括空格(例如,   C:\ PROGRA〜1);不这样做会   导致某些人抛出异常   依赖于价值的程序   JAVA_HOME“。

然后我重新启动了cmd(很重要,因为DOS shell在启动时只读取env变量,因此更改env var将要求您使用新的shell来获取更新的值)

最后ant -f core/build.xml工作了。

答案 4 :(得分:11)

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

要按照their Wiki的建议将ZXing库集成到Android应用中,您需要在项目中添加2个Java文件:

然后在 Android Studio 中将以下行添加到 build.gradle 文件中:

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

或者如果仍然使用带有ADT-plugin的 Eclipse core.jar文件添加到项目的 libs 子目录中(此处为fullscreen Windows和{{ 3}}):

Windows screenshot

最后将此代码添加到您的fullscreen Mac

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();
}

生成的应用会要求安装并启动MainActivity.java(扫描后会自动返回您的应用):

Barcode Scanner app

此外,如果您想构建并运行Barcode Scanner app by ZXing作为您自己的应用的灵感:

ZXing Test app

然后你需要来自ZXing Test app的4个Java文件:

  • BenchmarkActivity.java
  • BenchmarkAsyncTask.java
  • BenchmarkItem.java
  • ZXingTestActivity.java

来自GitHub的3个Jar文件:

  • core.jar添加
  • 机器人-core.jar添加
  • 机器人-integration.jar

(您可以使用mvn package自行构建Jar文件 - 如果您从GitHub查看ZXing并在您的计算机上安装 ant maven 工具)。

注意:如果您的项目无法识别Jar文件,则可能需要在项目属性中启动Java版本:

properties screenshot

答案 5 :(得分:4)

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

进入Gradle依赖项。就这么简单。在使用Android Studio和Gradle构建系统之前。

答案 6 :(得分:4)

您是否在zxing网站上看到了wiki pages?您似乎可能会发现GettingStartedDeveloperNotesScanningViaIntent有帮助。

答案 7 :(得分:2)

zxing家伙用1.7创建一个Android项目更容易。它不像过去那样痛苦。对于想要快速为android创建zxing项目的人来说,这是一个快速博客。

  • 查看zxing.org的zxing来源
  • 在日食上创建一个Android项目
  • 删除main.xml
  • 右键单击“src”目录并点击导入。按提及的顺序浏览到以下目录。当您逐个添加它们以进行导入时,请确保在导入向导的编辑字段中具有src目录。并且您只选择左目录树中的“com”目录。不要选择src。
  • 机器人集成
  • 机器人
  • 确保你的android sdk版本是9,任何小的和androidmanifest.xml都会哭。
  • 使用其中一种语言的Strings.xml,只需在'character
  • 之前放置一个/

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

http://www.4shared.com/file/bFx8Y5Ys/zXingJune2010.html 无法提供任何

答案 8 :(得分:2)

如果你只需要zxing的core.jar,你可以跳过这个过程并从GettingStarted wiki page

获取预先构建的JAR

最新ZXing(2.2)在核心文件夹下没有core.jar,但您可以从zxing Maven repository here

获取core.jar

答案 9 :(得分:2)

在eclipse中逐步设置zxing 3.2.1

  1. 从“https://github.com/zxing/zxing
  2. 下载zxing-master.zip
  3. 解压缩zxing-master.zip,使用eclipse导入zxing-master中的“android”项目
  4. 从“http://repo1.maven.org/maven2/com/google/zxing/core/3.2.1/
  5. 下载core-3.2.1.jar
  6. 在“android”项目中创建“libs”文件夹并将cor-3.2.1.jar粘贴到libs文件夹中
  7. 点击项目:选择“属性” - &gt; “Java编译器”将级别更改为1.7。然后点击“Android”将“Project build target”更改为android 4.4.2+,因为使用1.7需要使用Android 4.4进行编译
  8. 如果“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 /”复制它并粘贴到你的项目中。
  9. 清理并构建项目。如果您的项目显示有关“switch - case”的错误,则应将其更改为“if - else”。
  10. 已完成。清理并建立项目。
  11. 参考链接:Using ZXing to create an android barcode scanning app

答案 10 :(得分:2)

我尝试了所有可能的方法来实现这一点,然后我发现了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. 你不需要在Core,Android客户端等之间混淆jars只需在你的项目中删除这些包和相关的布局,你就可以了。只需要Jar com.google.zxing:core:3.2.0 ,您可以从

    下载

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

  3. 无需添加大量软件包请参阅下面的图片进行比较

  4. 之前: -

    enter image description here

    之后: -

    enter image description here

    1. 最重要的部分是高度可定制即。你可以添加闪光灯,在碎片中使用它并支持方向改变。

    2. 您可以在 Cordova App 中使用此Capture活动进行条形码扫描。

    3. 您在应用清单中的捕获活动看起来像这样

        <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");
                  }
              }
          }
      }
      

      快乐融合!!

答案 11 :(得分:2)

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

答案 12 :(得分:1)

我刚写了一个方法,将生成的条形码Bitmap解码为String

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

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

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;
}

答案 13 :(得分:1)

2020更新:只需将其添加到您的Gradle文件中即可。效果很好!

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

答案 14 :(得分: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();

        }
    }

}

答案 15 :(得分:0)

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

  

Barcode Scanner API可以实时检测条形码   取向。您还可以检测并解析几个条形码   同时使用不同的格式。

https://developers.google.com/vision/

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

答案 16 :(得分:0)

此库的工作原理很吸引人,易于集成和使用。 https://github.com/dm77/barcodescanner