2015-10-29 38 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>

還是讓我知道,如果它有助於