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

我想将zxing扫描仪集成到我的应用程序,而不需要外部应用程序(从游戏商店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表示无法parsing符号: .android.CaptureActivity ,如果我运行这个,错误发生

java.lang.ClassNotFoundException:未find类“com.google.zxing.client.android.CaptureActivity”

发生了什么?

虽然已经有了答案,但是对于那些不想使用像ANT这样的自动安装方法的人来说,对于那些想使用ZXing作为库的人来说,

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

需要注意的是,这种方式对于创作者来说是可以接受的,并且不会违反他们的任何使用条款,因为我们不会复制他们的代码,而只是把它作为我们项目的一个库。

一般过程是这样的:

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

对于那些使用Eclipse的人来说,这是一个完全详细的过程(对于Studio也可以很容易地实现):

下载ZXing源代码和核心文件

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

将ZXing项目导入到Eclipse

  1. 打开Eclipse。
  2. 点击文件>导入,> Android>“现有的Android代码进入工作区”,从select窗口导航到您提取ZXing zip文件的文件夹,并select“Android”文件夹。 Eclipse现在应该检测包含一个名为“captureActivity”的项目的文件夹,导入该项目。
  3. 您现在应该在工作区中看到捕获活动。 根据ZXing版本,您可能需要将core.jar文件分配给ZXing项目,以检查是否属于您的版本打开captureActivity项目的libs文件夹并检查core.jar文件是否存在,如果不存在比你自己添加它,否则跳到下一章。

    5.1。 要添加core.jar文件,请右键单击Eclipse工作区中的captureActivity项目,然后select“构buildpath”>“configuration构buildpath”

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

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

    5.4。 input核心文件夹并selectcore.jar(名字可能会根据ZXing版本而有所不同),然后单击打开

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

将ZXing定义为库并修复代码

  1. 如果您尚未在构buildpath窗口中,请右键单击captureActivity项目,然后select构buildpath>configuration构buildpath。
  2. 从侧面菜单中selectAndroid并选中Is Library,点击Ok退出该窗口
  3. 现在取决于ZXing的版本,你可能会看到Eclipse标记一些包含错误的java文件,如果是这样的话,你将不得不修复代码来匹配android java版本,否则简单地移动到下一章

    8.1。 在编辑器中打开每个破碎的java文件,并用一串If Else语句replace断开的Switch语句,这是我所知道的一个烦人的部分。

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

  1. 如果一切正常,那么captureActivity应该像工作区中的任何普通项目文件夹一样出现,没有错误或红色! 标志。 要将ZXing定义为您自己项目中的库,请右键单击工作区中的项目,然后select“构buildpath”>“configuration构buildpath”。
  2. 从侧面菜单中selectAndroid。 单击窗口右下方的添加button,然后从窗口中selectcaptureActivity。
  3. 就这样,您的项目现在可以使用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捕获活动中的任何其他活动也需要在项目清单中定义,还要注意,您必须授予项目权限才能使用相机,如下所示:

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

由于目前为止我发现的所有答案都基于Eclipse,而且现在已经过时了,所以我添加了一个答案,将ZXing添加为Android Studio(2.1.2)上的独立库。

我把编译的项目放在Github上https://github.com/tarun0/ZXing-Standalone-library只要在你的项目中添&#x52A0;zxing_standalone模块,你就可以开始。 有关详细信息或为新版本进行编译,请继续阅读。

这可能看起来很长,但是一旦你经历了这个过程,你会发现它很容易和短小。

  1. https://github.com/zxing/zxing/下载ZXing的库源代码我们只需要从这&#x4E2A;android目录。 所以,如果你碰巧有这个文件夹,你不需要下载大小约126MB的整个分支。
  2. http://repo1.maven.org/maven2/com/google/zxing/core/3.2.1/下载最新&#x7684;core-xxxjar
  3. 在你自己的项目中添加android项目。 为此,首先从Project ExplorerselectProject Explorer (参考图像)

在这里输入图像说明

  1. 现在点击您的项目,然后右键单击它,然后selectNew > Module > Import Gradle Project 。 现在,从下载的源代码中selectandroid目录(在步骤1中)。 (绝对新手参考下图)。 (可选)更改名称并设置导入的默认设置。 在这里输入图像说明
  2. 在这个导入的项目中,创build一个文件夹libs ,并将在步骤2中下载的core.jar文件放在这个文件夹中。 然后从文件菜单打开Project Structure ,并添加这个core.jar文件作为依赖项。

在这里输入图像说明 在步骤2中选择<code>添加文件依赖项</ code>

  1. 下载CameraConfigurationalUtils.java并将其粘贴到项目中。 在这里输入图像说明

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

  3. 在导入的项目的Manifest.xml文件中,进行以下修改。 在<application...标签中,删除android:icon...android:logo...并从intentfilter中删除这个<category android:name="android.intent.category.LAUNCHER"/>现在是一个图书馆,不应该在发射器(如果你不删除这个,你将最终有两个发射器的活动)。

  4. 在项目的build.gradle文件中,在dependencies块中,添加这一行compile project (':android')在这里,用步骤4中导入项目时select的名称replaceandroid 。同步并清理项目。 您将在switch语句中看到一些错误。 点击这些开关的情况下,selectAndroid Studio提供的选项replace with if选项。

而已。 现在,您可以在自己的应用程序中使用ZXing库。 🙂

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

在扫描(如点击一个button),发送意图:

 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的答案。

我不知道为什么发生,但最后我用另一个图书馆。 我从这里和这里使用Zxing-android-minimal和tutorial。 现在起作用了。

我真的很晚,但是我想回答这个问题,以便稍后帮助别人。 这并不是说上面的方法和解决scheme是错误的,它只是一个额外的信息,对于开发人员他/她会select更好的方式。 有一千条路是好的。

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

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

调用模块(例如:点击button):

 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

如果你遇到麻烦find像我这样的jar子,在这里你有url:

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

阐述stackex的答案….用任何名字创build一个活动。

 public class CaptureActivityAnyOrientation extends CaptureActivity { } 

在清单中定义所需的方向,或者像下面那样在景观和肖像中工作。

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

最后使用setCaptureActivity创build的活动。

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

希望这可以帮助。

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

 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; 

我希望这可以帮助别人。

安东尼

这是一个在eclipse上工作的方法:

ZXing集成在Eclipse的Android应用程序

快乐整合!