android - 如何在不安装实际的zxing应用程序的情况下集成Zxing条形码扫描仪(无法解析符号: . android.CaptureActivity)?

标签 android zxing

我想将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用作库而不使用任何自动安装方法(如ANT)的人来说,我感觉是一个深入的解决方案。

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

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

一般过程是这样的:

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

  • 这是使用Eclipse的用户的完整详细过程(对于Studio也可以很容易地实现):

    下载ZXing源代码和核心文件
  • 转到ZXing的GitHub项目页面(https://github.com/zxing/zxing),然后单击“下载zip”。
  • 提取文件(我建议使用大多数其他库资源都位于某个位置)

  • 将ZXing项目导入到Eclipse
  • 打开Eclipse。
  • 单击"file">“导入”,>“Android”>“将现有Android代码放入工作区”,从选择窗口导航到将ZXing zip文件提取到的文件夹,然后选择“Android”文件夹。 Eclipse现在应该检测到该文件夹​​包含一个名为“captureActivity”的项目,然后导入该项目。
  • 您现在应该在工作区中看到捕获 Activity 。取决于
    您拥有的ZXing版本可能需要将core.jar文件分配给
    ZXing项目,以检查您的版本是否适用
    打开captureActivity项目的libs文件夹,然后检查是否
    core.jar文件存在,如果不是,您必须自己添加它,
    否则请跳至下一章。

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

    5.2。从侧面菜单中选择“Java构建路径”,然后单击“库”选项卡。

    5.3。单击“添加外部JAR”,然后导航到最初导出ZXing zip的位置。

    5.4。进入核心文件夹并选择core.jar(名称可能因ZXing版本而异),然后单击“打开”

    5.5。现在,您应该在构建路径列表中看到core.jar,单击“订购和导出”选项卡并检查core.jar

  • 将ZXing定义为库并修复代码
  • 如果尚未位于构建路径窗口中,请右键单击captureActivity项目,然后选择“构建路径”>“配置构建路径”。
  • 从侧面菜单中选择“Android”,然后选中“Is Library”,单击“确定”退出窗口
  • 现在取决于ZXing的版本,您可能会看到Eclipse标记了一些包含错误的Java文件,如果是这种情况,则必须修复代码以匹配android Java版本,否则只需转到下一章

    8.1。在编辑器中打开每个损坏的Java文件,并用一系列If Ifse语句替换损坏的Switch语句,这是我知道的令人讨厌的部分。

  • 将ZXing添加为您自己的项目的库
  • 如果现在一切正常,则CaptureActivity应该看起来像工作区中的任何普通项目文件夹一样,没有错误或显示为红色!标志。要将ZXing定义为您自己的项目中的库,请在工作区中右键单击您的项目,然后选择“构建路径”>“配置构建路径”。
  • 从侧面菜单中选择Android。单击窗口右下角的“添加”按钮,然后从窗口中选择captureActivity。
  • 就是这样,您的项目现在可以将ZXing用作独立的库,而无需任何第三方安装。

  • 添加应用程序所需的ZXing方法

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

    运行扫描仪并捕获QR码:
    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 Capture Activity 中的任何其他 Activity 一样,也需要在项目 list 中定义,也请注意,您必须授予项目使用相机的权限,如下所示:
    <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/

    关于android - 如何在不安装实际的zxing应用程序的情况下集成Zxing条形码扫描仪(无法解析符号: . android.CaptureActivity)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29159104/

    相关文章:

    java - QR 码显示为空白

    android - zxing 条形码 - 如何将扫描器( Intent )嵌入到其他布局中

    java - 如何设计 Android 覆盖布局

    android - 系统或签名保护级别

    java - 我的应用程序在启动之前崩溃了。这是一个简单的应用程序,我在其中使用 Intent 来调用前一个类中的另一个类

    java - Android Studio 无法识别导入的项目库模块中所做的更改

    android - ZXing 如何设置位图的大小?

    android - 如何在Android APP中隐藏API URL和参数?

    android - 删除本地存储但仍然存在

    java - 如何导入和使用zxing库?