2015-10-29 37 views
10

我跟随此tutorial了解如何构建可扫描QR码的Android应用程序。使用Android的Mobile Vision API扫描QR代码

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

的AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="bitinvent.io.qrscanner" > 

    <meta-data android:name="com.google.android.gms.vision.DEPENDENCIES" android:value="barcode"/> 
    <uses-permission android:name="android.permission.INTERNET"/> 
    <uses-permission android:name="android.permission.CAMERA"/> 

    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme" > 
     <activity android:name=".MainActivity" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 

</manifest> 

activity_main.xml中

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" 
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> 

    <SurfaceView 
     android:id="@+id/cameraView" 
     android:layout_width="640px" 
     android:layout_height="480px" 
     android:layout_centerVertical="true" 
     android:layout_alignParentLeft="true"/> 

    <TextView 
     android:id="@+id/infoTextView" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentTop="true" 
     android:layout_toRightOf="@+id/cameraView" 
     android:layout_marginLeft="16dp" 
     android:text="Nothing to read" 
     android:textSize="20sp"/> 

</RelativeLayout> 

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<Barcode>() { 
      @Override 
      public void release() { 

      } 

      @Override 
      public void receiveDetections(Detector.Detections<Barcode> detections) { 
       final SparseArray<Barcode> 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码时,它不会检测到任何东西。但是也不会出现错误或崩溃。

我错过了什么吗?

+0

嗨,我知道这是一个相当古老的问题,但我面临与Android 4.4.2相同的问题。在Android 6上它工作正常,但在这个版本中,qr-code从来没有得到任何结果..你知道为什么吗? –

+0

@PierGiorgioMisley不,我找不到这个问题的解决方案。抱歉。 – Isuru

+0

好的非常感谢你,如果我找到解决方法,我会告诉你一些事情 –

回答

0

我是新开发的Android开发人员,但我使用了play services 8.1跟着教程。工作。

代码与您的代码非常相似。只有不同之处在于我在应用程序级别下有元标记,并且删除了.setBarcodeFormats(Barcode.QR_CODE),因为它将其专门限制为QR类型代码。

也使用横向应用程序,因为肖像不适合我。即使在QR码的环境中,我有时也必须慢慢将QR码从相机移开,直到它能够识别它。

0

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

0

尝试后<intent-filter/>

以下行

<meta-data android:name="com.google.android.gms.vision.DEPENDENCIES" android:value="barcode" />

移动到您的活动代码在YOUT清单右所以它看起来像这样

<meta-data android:name="com.google.android.gms.vision.DEPENDENCIES" android:value="barcode" /> </activity>

还是让我知道,如果它有助于