在Android Studio中集成ZXing

97

我会开始解释我所做的所有步骤,最后会说出问题所在。

  1. 下载 ZXing-2.2 https://code.google.com/p/zxing/downloads/list
  2. 将 zxing-2.2 中的所有文件解压缩。
  3. 下载并安装 Apache Ant http://www.youtube.com/watch?v=XJmndRfb1TU
  4. 使用 Windows 命令行(运行→CMD)导航到已提取的目录中
  5. 在命令行窗口中 - 输入“ant -f core/build.xml”,然后按回车键,让 Apache 运行它的黑科技。

此时就像将 ZXing 库直接集成到我的 Android 应用程序中一样了。

但是糟糕了,“Buildfile: core\build.xml 不存在!构建失败。好。6. 导入 ZXing - 缺少 core/build.xml 文件

现在有了我的 core.jar。

  1. 打开 Android Studio,File -> Import Project -> Select /zxing-2.2/android/ -> Create project from existing sources -> Project name: andoid -> Source files for... all checked Next -> Libraries (cant do nothing) Next -> Modules (android checked) Next -> SDK 1.7 Next -> Finish

打开项目 -> Build -> Rebuild project

100 个错误,19 个警告

文件 -> 项目结构 -> 库 -> 添加 -> Java -> 选择我之前创建的 core.jar 并单击“确定” -> 库“core”将被添加到所选模块(android)中。 点击“确定” -> 在“项目结构”对话框中单击“确定”。

Build -> Rebuild Project

15 个错误,20 个警告

所有错误都是“需要常量表达式”的错误,我看到ZXing 项目在 Android 中的 Switch case 出现错误,于是我将所有 switch 语句改为 if else 语句。

0 个错误,20 个警告

好了,现在继续:

文件 -> 新建项目 -> zxing_demo 下一步 -> 下一步 -> 空白活动 下一步 -> 完成

在新项目中 -> 文件 -> 导入模块 -> 搜索并选择 /zxing-2.2/android/ 单击“确定”-> 从现有源代码创建模块 下一步 -> 下一步 -> 下一步 -> 下一步 -> 完成

现在我可以在浏览器中看到 /zxing-2.2/android/、/zging_demoProject/ 和 External Libraries。

现在我将我的代码更改为扫描 QR。

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.zxing_demo"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
    android:minSdkVersion="7"
    android:targetSdkVersion="16" />
<uses-permission android:name="android.permission.CAMERA"/>
<uses-feature android:name="android.hardware.camera" />
<uses-feature
    android:name="android.hardware.camera.autofocus"
    android:required="false" />
<uses-feature
    android:name="android.hardware.touchscreen"
    android:required="false" />
<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name="com.example.zxing_demo.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:clearTaskOnLaunch="true"
        android:stateNotNeeded="true"
        android:configChanges="orientation|keyboardHidden"
        android:name="com.google.zxing.client.android.CaptureActivity"
        android:screenOrientation="landscape"
        android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
        android:windowSoftInputMode="stateAlwaysHidden" >
        <intent-filter >
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
        <intent-filter >
            <action android:name="com.google.zxing.client.android.SCAN" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>
</application>

主活动.java

package com.example.zxing_demo;

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

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Intent intent = new Intent("com.google.zxing.client.android.SCAN");
    intent.putExtra("SCAN_MODE", "QR_CODE_MODE");
    startActivityForResult(intent, 0);
}


public void onActivityResult(int requestCode, int resultCode, Intent intent) {
    if (requestCode == 0) {
        if (resultCode == RESULT_OK) {
            String contents = intent.getStringExtra("SCAN_RESULT");
            String format = intent.getStringExtra("SCAN_RESULT_FORMAT");
            // Handle successful scan
        } else if (resultCode == RESULT_CANCELED) {
            // Handle cancel
        }
    }
}

}

现在进行测试,运行->调试

出现了崩溃。

日志记录器

08-31 02:58:28.085  20665-20665/com.example.zxing_demo E/AndroidRuntime: FATAL EXCEPTION: main
    java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.zxing_demo/com.google.zxing.client.android.CaptureActivity}: java.lang.ClassNotFoundException: com.google.zxing.client.android.CaptureActivity
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1891)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1992)
    at android.app.ActivityThread.access$600(ActivityThread.java:127)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1158)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:4448)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:823)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:590)
    at dalvik.system.NativeStart.main(Native Method)
    Caused by: java.lang.ClassNotFoundException: com.google.zxing.client.android.CaptureActivity
    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:61)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:501)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:461)
    at android.app.Instrumentation.newActivity(Instrumentation.java:1023)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1882)
    ... 11 more

我可以在 AndroidManifest.xml 中看到这一行

android:name="com.google.zxing.client.android.CaptureActivity"

"CaptureActivity"显示为红色,错误提示为:无法解析符号“CaptureActivity”。

文件->项目结构->模块->zxing_demo->依赖项->添加->模块依赖项->android OK->应用和确定

现在,CaptureActivity看起来不错了。

再次进行调试。

08-31 03:06:58.513  21740-21740/com.example.zxing_demo E/AndroidRuntime: FATAL EXCEPTION: main
    java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.zxing_demo/com.google.zxing.client.android.CaptureActivity}: java.lang.ClassNotFoundException: com.google.zxing.client.android.CaptureActivity
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1891)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1992)
    at android.app.ActivityThread.access$600(ActivityThread.java:127)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1158)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:4448)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:823)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:590)
    at dalvik.system.NativeStart.main(Native Method)
    Caused by: java.lang.ClassNotFoundException: com.google.zxing.client.android.CaptureActivity
    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:61)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:501)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:461)
    at android.app.Instrumentation.newActivity(Instrumentation.java:1023)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1882)
    ... 11 more

我想我会使用应用程序和意图,但现在我想要做这项工作,如果有人知道发生了什么,请告诉我。


这个问题有很多观看次数,所以如果有人需要的话,这是一个非常类似的问题 - Daniel Wilson
5个回答

243

我正在将ZXING集成到一个Android应用程序中,但是没有什么好的输入源可以使用。我会给你一些提示,告诉你我是如何解决这个问题的 - 因为它事实上非常容易.

有一个非常方便的git存储库,提供了zxing Android库项目作为AAR归档文件。

你所要做的就是将这个内容添加到你的build.gradle中。

repositories {
    jcenter()
}

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

Gradle会进行编译并使代码在您的应用程序中可访问,这是一种神奇的方式。

要启动Scanner,请使用此类/方法:从Activity开始:

new IntentIntegrator(this).initiateScan(); // `this` is the current Activity

从一个片段:

IntentIntegrator.forFragment(this).initiateScan(); // `this` is the current Fragment
// If you're using the support library, use IntentIntegrator.forSupportFragment(this) instead.

有几个自定义选项:

IntentIntegrator integrator = new IntentIntegrator(this);
integrator.setDesiredBarcodeFormats(IntentIntegrator.ONE_D_CODE_TYPES);
integrator.setPrompt("Scan a barcode");
integrator.setCameraId(0);  // Use a specific camera of the device
integrator.setBeepEnabled(false);
integrator.setBarcodeImageEnabled(true);
integrator.initiateScan();

他们有一个示例项目,并提供了几个集成示例:

如果你已经访问了链接,你会看到我只是从Git README中复制粘贴了代码。如果没有,请前往那里获取更多洞察和代码示例。


3
非常有帮助。我花了一整天的时间尝试从另一个项目导入Zxing,但一无所获。然后我找到了这个链接,,搞定了。只需按照此链接中的代码示例进行操作:https://github.com/zxing/zxing/wiki/Scanning-Via-Intent。 - Jack BeNimble
1
代码运行正常!但我有一个问题,我想要扫描器竖屏,并需要为扫描屏幕添加自定义布局。有人能告诉我如何实现吗? - Harsh Trivedi
2
要更改方向,请创建一个扩展CaptureActivity的新活动,并在AndroidManifest.xml中指定方向。 - ChaturaM
@LangustenGustel这个工作是否不需要安装条形码应用程序?我之前在一个应用程序中实现了ZXing,将其转换为无需安装第三方扫描器应用程序即可工作。只是想知道在尝试导入我的旧代码之前,是否可以在没有扫描器应用程序的情况下工作。 - Janpan
1
@日本;是的,它可以! - Langusten Gustel
显示剩余6条评论

8

如果有人遇到同样的问题,可以按照以下简单步骤进行操作:

使用选项 导入项目(Eclipse ADT、Gradle等) 从下载的 zxing-master 压缩文件中导入 android 项目,并在您的应用程序级别的 build.gradle 文件中添加以下 2 行代码,然后就可以运行了。

如此简单,是吧...

dependencies {
        // https://mvnrepository.com/artifact/com.google.zxing/core
        compile group: 'com.google.zxing', name: 'core', version: '3.2.1'
        // https://mvnrepository.com/artifact/com.google.zxing/android-core
        compile group: 'com.google.zxing', name: 'android-core', version: '3.2.0'

    }

您可以从以下链接中获取最新版本的coreandroid core

https://mvnrepository.com/artifact/com.google.zxing/core/3.2.1 https://mvnrepository.com/artifact/com.google.zxing/android-core/3.2.0

更新(2019年5月29日)

请改用以下依赖项:

dependencies {
    implementation 'com.google.zxing:core:3.4.0'
    implementation 'com.google.zxing:android-core:3.3.0'
}

完美简单的答案 :) 经过许多研究和开发,我找到了这个链接,看起来像是魔法发生了。 - Ramkesh Yadav
1
现在最新版本的 Core 和 Android Core 是:dependencies { // https://mvnrepository.com/artifact/com.google.zxing/core implementation group: 'com.google.zxing', name: 'core', version: '3.3.2' // https://mvnrepository.com/artifact/com.google.zxing/android-core implementation group: 'com.google.zxing', name: 'android-core', version: '3.3.0'} - Ramkesh Yadav
我想将这个合并到已经制作好的项目中,而不是作为新项目导入,那么我该如何实现呢?急需帮助 :) - Ramkesh Yadav
谢谢!我还需要导入项目并添加依赖项。 - CoolMind

7
buttion.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                new com.google.zxing.integration.android.IntentIntegrator(Fragment.this).initiateScan();
            }
        });

    public 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");
                Toast.makeText(this, "Scanned: " + result.getContents(), Toast.LENGTH_LONG).show();
            }
        } else {
            // This is important, otherwise the result will not be passed to the fragment
            super.onActivityResult(requestCode, resultCode, data);
        }
    }



dependencies {
    compile 'com.journeyapps:zxing-android-embedded:3.2.0@aar'
    compile 'com.google.zxing:core:3.2.1'
    compile 'com.android.support:appcompat-v7:23.1.0'
}

3

从版本4.x开始,默认只支持Android SDK 24及以上版本,并且需要使用androidx。

请在你的build.gradle文件中添加以下内容:

repositories {
    jcenter()
}

dependencies {
    implementation 'com.journeyapps:zxing-android-embedded:4.1.0'
    implementation 'androidx.appcompat:appcompat:1.0.2'
}

android {
    buildToolsVersion '28.0.3' // Older versions may give compile errors
}

旧版 SDK

对于 Android SDK 版本小于 24 的情况,您可以将 zxing:core 版本降级至 3.3.0 或更早版本以支持 Android 14+:

repositories {
    jcenter()
}

dependencies {
    implementation('com.journeyapps:zxing-android-embedded:4.1.0') { transitive = false }
    implementation 'androidx.appcompat:appcompat:1.0.2'
    implementation 'com.google.zxing:core:3.3.0'
}

android {
    buildToolsVersion '28.0.3'
}

你还需要在你的Android清单文件中添加以下内容:

<uses-sdk tools:overrideLibrary="com.google.zxing.client.android" />

来源: https://github.com/journeyapps/zxing-android-embedded

这个网址是关于“zxing-android-embedded”存储在Github上的。

-1

这个教程帮助我在Android Studio中进行集成: http://wahidgazzah.olympe.in/integrating-zxing-in-your-android-app-as-standalone-scanner/ 如果下载失败,请尝试 THIS

只需将其添加到 AndroidManifest.xml 中即可。

<activity
         android:name="com.google.zxing.client.android.CaptureActivity"
         android:configChanges="orientation|keyboardHidden"
         android:screenOrientation="landscape"
         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>

希望这可以帮到你!


那没有帮助。 - SkyPunch
@deepakgates:过时了,你能提供一些代码来检查吗? - hirigoshy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接