2015-10-29 21 views
10

Ho seguito questo tutorial su come creare un'app per Android in grado di eseguire la scansione dei codici QR.Scansione del codice QR utilizzando l'API di Android Mobile Vision

Ecco il codice completo. Ho aggiunto i servizi di Google Play utilizzando un voto come compile 'com.google.android.gms:play-services:7.8.0'.

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); 
         } 
        }); 
       } 
      } 
     }); 
    } 
} 

Ho provato questo su un HTC Desire 816 con Android 4.4.2. Ma non sembra funzionare. La vista della videocamera è attiva ma quando viene puntata su un codice QR, non rileva nulla. Ma non si verificano errori o arresti anomali.

Mi manca qualcosa?

+0

Ciao, lo so che è una domanda piuttosto vecchia ma sto affrontando lo stesso problema con Android 4.4.2. Su Android 6 funziona bene, ma su questa versione il qr-code non ottiene mai alcun risultato ... sai perché? –

+0

@PierGiorgioMisley No, non sono riuscito a trovare una soluzione a questo problema. Scusate. – Isuru

+0

ok grazie mille, ti dirò una cosa se trovo una soluzione alternativa –

risposta

0

Sono nuovo nello sviluppo di Android ma ho seguito il tutorial utilizzando i servizi di riproduzione 8.1. Lavorato.

Il codice è molto simile al tuo. Solo le differenze sono che ho il meta tag sotto il livello dell'applicazione e ho rimosso .setBarcodeFormats (Barcode.QR_CODE) poiché limita in modo specifico i codici di tipo QR.

Utilizzata anche l'applicazione in orizzontale poiché il ritratto non funzionava per me. Anche in orizzontale per i codici QR, talvolta dovevo spostare lentamente il codice QR dalla fotocamera fino a quando non era in grado di riconoscerlo.

0

Hai abilitato la connessione Internet nel dispositivo? Per scaricare dati tramite i servizi di Google Play; richiede la connessione a Internet tramite il dispositivo, tuttavia non è necessario fornire alcuna autorizzazione.

0

Prova spostare la riga seguente

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

per il tag attività in yout destra manifesta dopo <intent-filter/>

quindi sarebbe simile a questa

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

Lemme sapere se aiuta

Problemi correlati