如何在不安装实际 zxing 应用程序的情况下集成 Zxing Barcode Scanner(无法解析符号:.android.CaptureActivity)?

How to integrate Zxing Barcode Scanner without installing the actual zxing app (cannot resolve symbol: .android.CaptureActivity)?

我想将 zxing 扫描仪集成到我的应用程序中,而不需要外部应用程序(来自 play 商店的 zxing 扫描仪)。这是我的代码

Button scan = (Button) findViewById(R.id.scan_button);
scan.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent intent = new Intent("com.google.zxing.client.android.SCAN");
        intent.setPackage("com.mypackage.app");
        intent.putExtra("SCAN_MODE", "QR_CODE_MODE");
        startActivityForResult(intent, SCANNER_REQUEST_CODE);
    }
});

@Override
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
    if (requestCode == SCANNER_REQUEST_CODE) {
        // Handle scan intent
        if (resultCode == Activity.RESULT_OK) {
            // Handle successful scan
            String contents = intent.getStringExtra("SCAN_RESULT");
            String formatName = intent.getStringExtra("SCAN_RESULT_FORMAT");
            byte[] rawBytes = intent.getByteArrayExtra("SCAN_RESULT_BYTES");
            int intentOrientation = intent.getIntExtra("SCAN_RESULT_ORIENTATION", Integer.MIN_VALUE);
            Integer orientation = (intentOrientation == Integer.MIN_VALUE) ? null : intentOrientation;
            String errorCorrectionLevel = intent.getStringExtra("SCAN_RESULT_ERROR_CORRECTION_LEVEL");

        } else if (resultCode == Activity.RESULT_CANCELED) {
            // Handle cancel
        }
    } else {
        // Handle other intents
    }

}

AndroidManifest.xml

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

我的 Android Studio 说无法解析符号:.android.CaptureActivity 如果我 运行 这个,就会发生错误

java.lang.ClassNotFoundException: Didn't find class "com.google.zxing.client.android.CaptureActivity"

发生了什么事?

我不知道为什么会这样,但最后我使用了另一个库。我使用 Zxing-android-minimal and tutorial from and here。现在可以了。

虽然已经得到回答,但我觉得对于那些想使用 ZXing 作为库而不使用任何自动安装方法(如 ANT)的人来说,这是一个深入的解决方案。

ZXing 是一个开源项目(如 ZXing 网站所述),您可以将其功能用作项目库,而不是强制在用户设备上安装第 3 方应用程序,我认为这是首选大多数项目。

重要的是要注意,这种方式是创作者可以接受的,并且不会违反他们的任何使用条款,因为我们不会复制他们的代码,而只是将其用作我们项目的库。

大致流程是这样的:

  1. 正在下载ZXing源代码和核心文件。
  2. 将 ZXing 项目导入到您想要的任何环境中 (Eclipse/Studio)
  3. 将 ZXing 项目定义为库并修复代码以满足这些要求。
  4. 将 ZXing 添加到您自己项目的构建路径
  5. 根据您的应用程序的需要添加 ZXing 方法。

下面是针对使用 Eclipse 的用户的完整详细过程(对于 Studio 也可以非常轻松地实现):

正在下载ZXing源代码和核心文件

  1. 转到 ZXing 的 GitHub 项目页面 (https://github.com/zxing/zxing) 并单击“下载 zip”。
  2. 提取文件(我建议使用大多数其他库源所在的位置)

正在将 ZXing 项目导入 Eclipse

  1. 打开 Eclipse。
  2. 单击“文件”>“导入”>Android> "Existing Android Code Into Workspace",从 selection window 导航到您将 ZXing zip 文件解压缩到的文件夹,然后select "Android" 文件夹。 Eclipse 现在应该检测到该文件夹​​包含一个名为 "captureActivity" 的项目,导入该项目。
  3. 您现在应该会在您的工作区中看到捕获 activity。根据 您拥有的 ZXing 版本可能需要将 core.jar 文件分配给 ZXing 项目,检查您的版本是否属于这种情况 打开captureActivity项目的libs文件夹,查看是否 core.jar 文件存在,如果不存在则必须自己添加, 否则跳到下一章。

    5.1。要添加 core.jar 文件,请右键单击 Eclipse 工作区中的 captureActivity 项目,然后 select Build path > configure 构建路径

    5.2。从侧面菜单 select Java Build Path 并单击 Libraries 选项卡。

    5.3.Click "Add external JARs" 并导航到您最初导出 ZXing zip 的位置。

    5.4。进入核心文件夹和select core.jar(名称可能因ZXing版本而异)并点击打开

    5.5。您现在应该在构建路径列表中看到 core.jar,单击 "Order and Export" 选项卡并选中 core.jar

将ZXing定义为库并修复代码

  1. 如果您尚未进入构建路径 window,请右键单击 captureActivity 项目并 select 构建路径 > 配置构建路径。
  2. 从侧面菜单 select Android 并选中是库,单击确定退出 window
  3. 现在,根据您拥有的 ZXing 版本,您可能会看到 Eclipse 标记了一些包含错误的 java 文件,如果是这种情况,您将必须修复代码以匹配android java 版本,否则直接跳到下一章

    8.1。在编辑器中打开每个损坏的 java 文件,并用 If Else 语句链替换损坏的 Switch 语句,我知道这是一个烦人的部分。

将ZXing添加为自己项目的库

  1. 如果现在一切正常,captureActivity 应该像工作区中的任何普通项目文件夹一样显示,没有错误或红色!符号。要将 ZXing 定义为您自己项目中的库,请在工作区中右键单击您的项目,然后 select Build path>Configure build path。
  2. 从侧面菜单 select Android。单击 window 右下角的添加按钮并从 window select captureActivity.
  3. 就是这样,您的项目现在可以将 ZXing 作为一个独立的库使用,而无需任何第三方安装。

添加应用需要的ZXing方法

这部分并不是真正的指南,只是到目前为止我发现对我自己的需要有用的内容,我主要使用的两种方法是:

运行扫一扫并获取二维码:

Intent intent = new Intent(getApplicationContext(),CaptureActivity.class);
intent.setAction("com.google.zxing.client.android.SCAN");
intent.putExtra("SAVE_HISTORY", false);
startActivityForResult(intent, 0);

在onActivityResult()中获取扫描结果:

if (requestCode == 0) {
if (resultCode == RESULT_OK) {
String contents = data.getStringExtra("SCAN_RESULT");
Log.d(TAG, "contents: " + contents);
} else if (resultCode == RESULT_CANCELED) {
// Handle cancel
Log.d(TAG, "RESULT_CANCELED");
}
}

请注意,就像android中的任何其他activity一样,捕获activity也需要在项目清单中定义,还要注意您必须授予项目使用权限相机像这样:

<uses-permission android:name="android.permission.CAMERA" />
<activity
android:name="com.google.zxing.client.android.CaptureActivity"
android:screenOrientation="landscape" >
</activity>

我希望这会帮助其他人节省几个小时的研究时间。

作为额外的奖励,我推荐阅读: https://biocram.wordpress.com/2013/06/11/integrate-zxing-as-a-library-inside-an-android-project/

如果你像我一样找不到罐子,这里有 URL:

http://repo1.maven.org/maven2/com/google/zxing/

正在详细说明 stackex 的答案....用任何名称创建一个 activity。

public class CaptureActivityAnyOrientation extends CaptureActivity {
}

在清单中定义所需的方向或像下面这样保留以在横向和纵向中工作。

<activity android:name=".CaptureActivityAnyOrientation"
      android:screenOrientation="fullSensor"
      android:stateNotNeeded="true"
      android:theme="@style/zxing_CaptureTheme"
      android:windowSoftInputMode="stateAlwaysHidden"/>

最后使用activity创建为setCaptureActivity。

IntentIntegrator.forSupportFragment(fragment)
                    .setCaptureActivity(CaptureActivityAnyOrientation.class)
                    .setOrientationLocked(false)
                    .setBeepEnabled(true)
                    .addExtra("PROMPT_MESSAGE", "Scan QR Code")
                    .initiateScan(IntentIntegrator.QR_CODE_TYPES);

希望对您有所帮助。

由于到目前为止我找到的所有答案都是基于 Eclipse 并且到目前为止已经过时了,所以我添加了我的答案以将 ZXing 添加为 Android Studio (2.1.2) 上的独立库.

我已经把编译好的项目放在Github https://github.com/tarun0/ZXing-Standalone-library 只需在你的项目中添加zxing_standalone 模块就可以了。有关详细信息或为更新版本编译它,请继续阅读。

过程可能看起来很长,但是一旦你完成它,你会发现它很简单而且很短。

  1. https://github.com/zxing/zxing/ 下载 ZXing 库源代码 我们只需要 android 目录。所以如果你恰好已经有这个文件夹,你不需要下载整个分支,大约 126MB 大小。
  2. http://repo1.maven.org/maven2/com/google/zxing/core/3.2.1/
  3. 下载最新的 core-x.x.x.jar
  4. 在自己的项目中添加android项目。为此,首先,从 Project Explorer(参考图片)
  5. 中选择 Project

  1. 现在单击您的项目,然后右键单击它并 select New>Module>Import Gradle Project。现在,在 select 下载源代码的 android 目录中(在步骤 1 中)。 (绝对新手参考下面的图片)。或者,更改名称并使用默认设置进行导入。
  2. 在这个导入的工程中,建立一个文件夹libs,把第2步下载的core.jar文件放在这个文件夹里。然后从文件菜单打开 Project Structure 并将此 core.jar 文件添加为依赖项。

  1. 下载CameraConfigurationalUtils.java并将其粘贴到项目中。

  2. 现在在导入项目的gradle文件中做一些修改。 将 apply plugin: 'com.android.application' 更改为 apply plugin: 'com.android.library' 以告诉系统它是一个库。并删除 applicationId ... 语句。

  3. 在导入项目的Manifest.xml文件中,进行如下修改。 在 <application... 标签中,删除 android:icon...android:logo... 并从 intent 过滤器中删除这个 <category android:name="android.intent.category.LAUNCHER"/> 因为它现在是一个库,不应该在启动器上(如果你不删除它,你最终会有两个启动器活动。

  4. 在项目的 build.gradle 文件中,在 dependencies 块中,添加此行 compile project (':android') 此处,将 android 替换为您的名称在步骤 4 中导入项目时选择。同步并清理项目。您会在 switch 语句中看到一些错误。 单击这些开关盒和 select Android Studio 提供的 replace with if 选项。

就是这样。现在您可以在自己的应用程序中使用 ZXing 库。 :)

要使用添加的库,只需使用上面第一个答案中所述的 Intents(仅复制相同的代码):

扫描时(如点击按钮),发送 Intent:

Intent intent = new Intent(getApplicationContext(),CaptureActivity.class);
intent.setAction("com.google.zxing.client.android.SCAN");
intent.putExtra("SAVE_HISTORY", false);
startActivityForResult(intent, 0);

然后,在OnActivityResult

if (requestCode == 0) {
if (resultCode == RESULT_OK) {
String contents = data.getStringExtra("SCAN_RESULT");
Log.d(TAG, "contents: " + contents);
} else if (resultCode == RESULT_CANCELED) {
// Handle cancel
Log.d(TAG, "RESULT_CANCELED");
}
}

我尽量做到描述性。我希望人们觉得它有用。

请阅读代码作者之一关于将代码复制到您自己的应用程序中的回答:

参考资料: 以及其他一些 blogs/SO 个答案。

在我的代码中我得到了这个版本:

Camera.PreviewCallback myCallBack = new Camera.PreviewCallback() {
   @Override public void onPreviewFrame(byte[] data, Camera camera)
   {
      Camera.Parameters parameters = camera.getParameters();
      int width = parameters.getPreviewSize().width;
      int height = parameters.getPreviewSize().height;
      int format = parameters.getPreviewFormat();
      LuminanceSource source = null;
      if(format == ImageFormat.NV21) //YCbCr_420_SP)
      {
         source = new PlanarYUVLuminanceSource(imgData, bitmapWidth, bitmapHeight, 0,0, bitmapWidth,bitmapHeight, false);
      } else
      {
         throw new UnsupportedOperationException("Unsupported image format ");
      }
      BinaryBitmap bBitmap = new BinaryBitmap(new HybridBinarizer(source));
      try
      {
         Result result = reader.decode(bBitmap);
         txt.setText(result.getText())
      } catch (NotFoundException e)
      {
         //txt.setText("");
      }
   }
};

import android.hardware.Camera;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.LuminanceSource;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.NotFoundException;
import com.google.zxing.PlanarYUVLuminanceSource;
import com.google.zxing.Result;
import com.google.zxing.common.HybridBinarizer;

Camera mCamera;
MultiFormatReader reader;
TextView txt;

我希望这对某人有所帮助。

安东尼奥

我真的来晚了,但我想回复这个问题,以便稍后帮助其他人。这并不是说上面的方法和解决方案是错误的,它只是一个额外的信息,开发者he/she会选择更好的方法。有千条路不如一条路好

那么,让我们开始 gradle 并添加

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

像这样调用模块(例如:单击按钮):

IntentIntegrator integrator = new IntentIntegrator(Home.this);
            integrator.setDesiredBarcodeFormats(IntentIntegrator.ALL_CODE_TYPES);
            integrator.setPrompt("Scan Code");
            integrator.setCameraId(0);
            integrator.setBeepEnabled(true);
            integrator.setBarcodeImageEnabled(false);
            integrator.initiateScan();

得到如下结果:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    IntentResult intentResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
    if(intentResult != null) {
        if(intentResult.getContents() == null) {
            Log.d("MainActivity", "Cancelled");
            Toast.makeText(this, "Cancelled", Toast.LENGTH_LONG).show();

        } else {
            Log.d("MainActivity", "Scanned");
            Toast.makeText(this, "Scanned: " + intentResult.getContents(), Toast.LENGTH_LONG).show();
        }
    }

}

有关详细信息,您可以查看 link https://github.com/pethoalpar/ZxingExample

因为这个帖子很旧,但我刚刚遇到这个问题。所以,我只是为 Android Studio 上想要集成核心 类 的其他人发帖。您需要做的就是添加此依赖项

implementation 'com.google.zxing:core:x.x.x'

Android Studio 会自动为您推荐以上的最新版本。