Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在不安装实际Zxing应用程序的情况下集成Zxing条形码扫描仪(无法解析符号:.android.CaptureActivity)?_Android_Zxing - Fatal编程技术网

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

如何在不安装实际Zxing应用程序的情况下集成Zxing条形码扫描仪(无法解析符号:.android.CaptureActivity)?,android,zxing,Android,Zxing,我想将zxing扫描仪集成到我的应用程序中,而不需要外部应用程序(play store提供的zxing扫描仪)。这是我的密码 Button scan = (Button) findViewById(R.id.scan_button); scan.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Int

我想将zxing扫描仪集成到我的应用程序中,而不需要外部应用程序(play store提供的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:未找到类“com.google.zxing.client.android.CaptureActivity”


发生了什么事?

我不知道为什么会发生,但最后我使用了另一个库。我使用和的教程。现在它可以工作了。

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

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

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

一般过程如下:

  • 下载ZXing源代码和核心文件
  • 将ZXing项目导入到所需的任何环境(Eclipse/Studio)
  • 定义ZXing项目作为库,并修改代码以满足这些要求
  • 将ZXing添加到您自己项目的构建路径
  • 根据应用程序的要求添加ZXing方法
  • 下面是一个针对使用Eclipse的用户的详细过程(对于Studio也可以很容易地实现):

    下载ZXing源代码和核心文件

  • 转到ZXing的GitHub项目页面()并单击“下载zip”
  • 提取文件(我建议使用大多数其他库源所在的位置)
  • 将ZXing项目导入Eclipse

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

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

    5.2。从侧菜单中选择Java构建路径并单击库选项卡

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

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

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

  • 将ZXing定义为库并修复代码

  • 如果尚未在生成路径窗口中,请右键单击captureActivity项目,然后选择生成路径>配置生成路径
  • 从侧菜单中选择Android并检查Is Library,单击Ok退出窗口
  • 现在,根据ZXing的版本,您可能会看到Eclipse标记了一些包含错误的java文件,如果是这种情况,您必须修复代码以匹配android java版本,否则只需转到下一章

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

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

  • 如果一切正常,captureActivity应该像工作区中的任何普通项目文件夹一样显示,没有错误或红色!签名要将ZXing定义为您自己项目中的库,请在工作区中右键单击您的项目,然后选择“生成路径”>“配置生成路径”
  • 从侧边菜单中选择Android。单击窗口右下方的添加按钮,然后从窗口中选择captureActivity
  • 就是这样,您的项目现在可以使用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()中检索扫描结果:

    请注意,正如android capture中的任何其他活动一样,活动也需要在项目清单中定义,还请注意,您必须向项目授予使用摄像头的权限,如下所示:

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

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


    详细阐述stackex的答案。。。。创建具有任意名称的活动

    public class CaptureActivityAnyOrientation extends CaptureActivity {
    }
    
    在manifest中定义所需的方向,或者像下面这样在横向和横向中工作

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

    希望这能有所帮助。

    因为我找到的所有答案都是基于Eclipse的,而且到目前为止都很陈旧,所以我添加了我的答案,将ZXing添加为Android Studio(2.1.2)上的一个独立库

    我已经把编译好的项目放到Github上了,只要在你的项目中添加
    zxing_standalone
    模块,你就可以开始了。
    <activity android:name=".CaptureActivityAnyOrientation"
          android:screenOrientation="fullSensor"
          android:stateNotNeeded="true"
          android:theme="@style/zxing_CaptureTheme"
          android:windowSoftInputMode="stateAlwaysHidden"/>
    
    IntentIntegrator.forSupportFragment(fragment)
                        .setCaptureActivity(CaptureActivityAnyOrientation.class)
                        .setOrientationLocked(false)
                        .setBeepEnabled(true)
                        .addExtra("PROMPT_MESSAGE", "Scan QR Code")
                        .initiateScan(IntentIntegrator.QR_CODE_TYPES);
    
    Intent intent = new Intent(getApplicationContext(),CaptureActivity.class);
    intent.setAction("com.google.zxing.client.android.SCAN");
    intent.putExtra("SAVE_HISTORY", false);
    startActivityForResult(intent, 0);
    
    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");
    }
    }
    
    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;
    
    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();
            }
        }
    
    implementation 'com.google.zxing:core:x.x.x'