使用Android的Mobile Vision API扫描QR码

我按照本教程学习了如何构建可以扫描QR码的Android应用程序。

这是完整的代码。 我使用等级添加了Google Play服务,因此compile 'com.google.android.gms:play-services:7.8.0'

AndroidManifest.xml中

               

activity_main.xml中

      

MainActivity.java

 package bitinvent.io.qrscanner; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.util.SparseArray; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.widget.TextView; import com.google.android.gms.vision.CameraSource; import com.google.android.gms.vision.Detector; import com.google.android.gms.vision.barcode.Barcode; import com.google.android.gms.vision.barcode.BarcodeDetector; import java.io.IOException; public class MainActivity extends Activity { private SurfaceView cameraView; private TextView barcodeInfo; private CameraSource cameraSource; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); cameraView = (SurfaceView) findViewById(R.id.cameraView); barcodeInfo = (TextView) findViewById(R.id.infoTextView); BarcodeDetector detector = new BarcodeDetector.Builder(this).setBarcodeFormats(Barcode.QR_CODE).build(); cameraSource = new CameraSource.Builder(this, detector).setRequestedPreviewSize(640, 480).build(); cameraView.getHolder().addCallback(new SurfaceHolder.Callback() { @Override public void surfaceCreated(SurfaceHolder holder) { try { cameraSource.start(cameraView.getHolder()); } catch (IOException e) { Log.e("CAMERA SOURCE", e.getMessage()); } } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } @Override public void surfaceDestroyed(SurfaceHolder holder) { cameraSource.stop(); } }); detector.setProcessor(new Detector.Processor() { @Override public void release() { } @Override public void receiveDetections(Detector.Detections detections) { final SparseArray barcodes = detections.getDetectedItems(); if (barcodes.size() != 0) { barcodeInfo.post(new Runnable() { @Override public void run() { barcodeInfo.setText(barcodes.valueAt(0).displayValue); } }); } } }); } } 

我在运行Android 4.4.2的HTC Desire 816上进行了测试。 但它似乎没有用。 摄像机视图处于活动状态,但当指向QR码时,它不会检测到任何内容。 但是也没有发生错误或崩溃。

我错过了什么吗?

  • javax.net.ssl.SSLException:证书中的主机名与android不匹配
  • Android cameraSource.stop()导致应用程序冻结
  • 将WiFi设置共享为WPA2 Enterprise的QR码
  • 二维码扫描没有全屏相机
  • 使用Android的Mobile Vision API扫描QR码
  • 如何制作QR码阅读器
  • QR码扫描没有全屏相机
  • Android从QR码启动应用程序与PARAMS
  • 我是Android开发的新手,但我使用播放服务8.1来学习本教程。 工作。

    代码与您的代码非常相似。 唯一的区别是我在应用程序级别下有元标记,并且我删除了.setBarcodeFormats(Barcode.QR_CODE),因为它专门限制为QRtypes代码。

    也在风景中使用应用程序,因为肖像不适合我。 即使在QR码的风景中,我有时也必须慢慢地将QR码移离相机,直到它能够识别它为止。

    您是否在设备中启用了互联网连接? 要通过Google Play服务下载数据; 它需要通过设备进行互联网连接,但您无需提供任何许可。

    尝试移动以下行

    之后立即显示在您的活动标签中

    所以它看起来像这样

    Lemme知道它是否有帮助

    最后,我让它在我身边工作。 我想分享我现在在我的应用程序中实现QR码扫描的过程和代码。 我实际上并没回答你的问题。 但是,我没有从StackOverflowfind任何有关如何使用Google Vision API实现QR代码扫描的良好帮助。 我查看了你在问题中指出的教程。 但是,该教程对我也没有多大帮助。 因此,我在我的应用程序中放下了实现QR码扫描的类和步骤。

    首先,您需要一些gradle依赖项。 因此,在build.gradle文件中,添加以下依赖项。

     dependencies { compile 'com.android.support:design:25.3.1' compile 'com.google.android.gms:play-services-vision:10.2.1' } 

    然后,您需要在项目中包含以下五个类。 我在这里添加课程。 如有必要,请导入缺少的课程。

    1. CameraSource.java
    2. CameraSourcePreview.java
    3. BarcodeCaptureActivity.java
    4. BarcodeGraphicTracker.java
    5. BarcodeTrackerFactory.java

    现在, BarcodeCaptureActivity还有一个布局,您需要将其放入layout文件夹中。

    这是您需要的barcode_capture.xml布局。

     < ?xml version="1.0" encoding="utf-8"?>     

    您需要在BarcodeCaptureActivity清单中使用一些字符串和一个活动条目。 以下是您需要在strings.xml中添加的strings.xml

      Access to the camera is needed for detection This application cannot run because it does not have the camera permission. The application will now exit. Face detector dependencies cannot be downloaded due to low device storage OK 

    并且AndroidManifest.xml应该为BarcodeCaptureActivity提供一个新条目,如下所示。

      

    现在您的设置已完成,您可以打开相机扫描条形码或QR码。 只需在必要时调用以下的initiateScanfunction。

     public static final int RC_BARCODE_CAPTURE = 9001; public void initiateScan() { Intent intent = new Intent(YourActivity.this, BarcodeCaptureActivity.class); startActivityForResult(intent, RC_BARCODE_CAPTURE); } 

    请注意,在调用initiateScanfunction之前,您需要向用户请求相机许可。 在授予摄像机许可权后,您将调用initiateScanfunction。

    initiateScanfunction将打开扫描仪,然后在成功扫描后,它将返回到调用的ActivityFragment 。 因此,您需要在调用ActivityFragment使用onActivityResult函数。

     @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == CommonStatusCodes.SUCCESS && requestCode == RC_BARCODE_CAPTURE) { if (data == null) return; Barcode barcode = data.getParcelableExtra(BarcodeCaptureActivity.BarcodeObject); final String scanResult = barcode.displayValue; if (scanResult == null) return; doSomethingWithTheScanResult(scanResult); } } 

    不要忘记在AndroidManifest.xml文件中添加CAMERA权限。

      

    希望有助于使用Google Vision API更轻松地集成QR代码扫描程序。 我为一个示例QR码扫描器应用程序添加了一个github项目 。 请看一看。