如何整合Zxing条码扫描器而不安装实际的zxing应用程序(无法解析符号:.android.CaptureActivity)?

时间:2015-03-20 03:50:31

标签: 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:找不到类&#34; com.google.zxing.client.android.CaptureActivity&#34;

发生了什么事?

9 个答案:

答案 0 :(得分:46)

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

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

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

一般过程如下:

  1. 下载ZXing源代码和核心文件。
  2. 将ZXing项目导入您想要的任何环境(Eclipse / Studio)
  3. 定义ZXing项目以充当库并修复代码以满足这些要求。
  4. 将ZXing添加到您自己项目的构建路径
  5. 根据您的应用程序的需要添加ZXing方法。
  6. 这是一个使用Eclipse的完全详细的过程(也可以很容易地为Studio实现):

    下载ZXing源代码和核心文件

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

      1. 打开Eclipse。
      2. 点击文件&gt;导入,&gt; Android&gt; “现有Android代码进入工作区”,从选择窗口导航到您将ZXing zip文件解压缩到的文件夹,然后选择“Android”文件夹。 Eclipse现在应该检测到该文件夹​​包含一个名为“captureActivity”的项目,导入该项目。
      3. 您现在应该在工作区中看到捕获活动。取决于 你有ZXing版本可能需要将core.jar文件分配给 ZXing项目,检查您的版本是否属于这种情况 打开captureActivity项目的libs文件夹并检查是否 core.jar文件存在,如果不是你必须自己添加, 否则跳到下一章。

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

        5.2。从侧面菜单中选择Java Build Path,然后单击Libraries选项卡。

        5.3。点击“添加外部JAR”并导航到最初导出ZXing zip的位置。

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

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

      4. 将ZXing定义为库并修复代码

        1. 如果您尚未进入构建路径窗口,请右键单击captureActivity项目并选择构建路径&gt;配置构建路径。
        2. 从侧边菜单中选择Android并选中Is Library,然后单击Ok退出窗口
        3. 现在根据您所拥有的ZXing版本,您可能会看到Eclipse标记包含错误的一些java文件,如果是这种情况,您将不得不修复代码以匹配android java版本,否则只需移动到下一章

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

        4. 将ZXing添加为您自己项目的库

          1. 如果一切顺利,现在captureActivity应该像工作区中的任何普通项目文件夹一样,没有错误或红色!标志。要将ZXing定义为您自己项目中的库,请在工作区中右键单击您的项目,然后选择构建路径&gt;配置构建路径。
          2. 从侧边菜单中选择Android。单击窗口右下角的“添加”按钮,然后从窗口中选择“captureActivity”。
          3. 就是这样,您的项目现在可以将ZXing用作独立的库,而无需任何第三方安装。
          4. 添加应用程序所需的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捕获活动中的任何其他活动一样,也需要在项目清单中定义,同时请注意,您必须授予项目使用相机的权限,如下所示:

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

答案 1 :(得分:39)

由于我到目前为止找到的所有答案都是基于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中选择Project Explorer(参见图片)
  5. enter image description here

    1. 现在点击您的项目,然后右键点击它并选择New&gt; Module&gt; Import Gradle Project。现在,从下载的源代码中选择android目录(在步骤1中)。 (参见下面的绝对新手)。 (可选)更改名称并设置导入的默认设置。 enter image description here
    2. 在此导入的项目中,创建一个文件夹libs,并将步骤2中下载的core.jar文件放入此文件夹中。然后从文件菜单中打开Project Structure并将此core.jar文件添加为依赖项。
    3. enter image description here In step 2 Select <code>Add file dependency</code>

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

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

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

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

      5. 那就是它。现在,您可以在自己的应用程序中使用ZXing库。 :)

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

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

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

        我试图尽可能具有描述性。我希望人们觉得它很有用。

        有关将代码复制到您自己的应用中的代码的作者之一,请阅读此答案:https://stackoverflow.com/a/9942761

        参考文献: https://stackoverflow.com/a/29818279 https://stackoverflow.com/a/29960361 还有一些其他博客/ SO答案。

答案 2 :(得分:27)

我不知道为什么会这样,但最后我还是使用了另一个库。我使用了来自Zxing-android-minimalherehere和教程。现在它有效。

答案 3 :(得分:16)

我已经很晚了,但是我想回复一下,以便其他人以后再帮忙。这并不是说上述方法和解决方案都是错误的,它只是一个额外的信息,因此,对于开发者他/她将选择更好的方式。拥有一条路比拥有一条路还好。

所以,让我们开始我们的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();
        }
    }

}

有关详细信息,请查看链接 https://github.com/pethoalpar/ZxingExample

答案 4 :(得分:3)

如果你找到像我这样的罐子有麻烦,你可以在这里找到URL:

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

答案 5 :(得分:2)

阐述stackex的答案....创建一个任何名称的活动。

$(document).ready(function(){ 
  var ids = "#HideDateFromLabel, #HideDateToLabel, #HideDateFrom, #HideDateTo";

  $(ids).hide();

     $('[name="waterall"]').on('change', function(){
        if($(this).is(':checked') && $(this).attr('id') == 'CheckboxGroup1_0' ) {
             $(ids).show();
        }
        else{
                $(ids).hide();
        }
    });

});

在清单中定义所需的方向或留下如下所示在横向和肖像中工作。

public class CaptureActivityAnyOrientation extends CaptureActivity {
}

最后使用创建为setCaptureActivity的活动。

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

希望这有帮助。

答案 6 :(得分:2)

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

    "external": true,

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

我希望这有助于某人。

安东尼

答案 7 :(得分:0)

这是一种适用于eclipse的方法:

ZXing integration on eclipse android app

快乐融合!

答案 8 :(得分:0)

由于该线程较旧,但是我刚遇到这个问题。因此,我只是发布给所有想要集成核心类的Android Studio用户。您需要做的就是添加此依赖项

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

Android Studio会自动为您建议上述最新版本。