5

Ich verwende Google Play Services Visible API für das Lesen von Barcodes. Ich habe einen Code von official CodeLabs example versucht, der bei einigen (überhaupt nicht) Geräten nicht funktioniert. Hier ist Logcat Nachricht:Android Google Play Service Vision Barcode-Scanner Bibliothek nicht gefunden

I/Vision﹕ Supported ABIS: [armeabi-v7a, armeabi] 
D/Vision﹕ Library not found: /data/data/com.google.android.gms/files/com.google.android.gms.vision/barcode/libs/armeabi-v7a/libbarhopper.so 
I/Vision﹕ Requesting barcode detector download. 
D/AndroidRuntime﹕ Shutting down VM 
E/AndroidRuntime﹕ FATAL EXCEPTION: main 
Process: PID: 24921 
java.lang.ArrayIndexOutOfBoundsException: length=0; index=0 
     at android.util.SparseArray.valueAt(SparseArray.java:273) 
     at MainActivity$1.onClick(MainActivity.java:50) 
     at android.view.View.performClick(View.java:4780) 
     at android.view.View$PerformClick.run(View.java:19866) 
     at android.os.Handler.handleCallback(Handler.java:739) 
     at android.os.Handler.dispatchMessage(Handler.java:95) 
     at android.os.Looper.loop(Looper.java:135) 
     at android.app.ActivityThread.main(ActivityThread.java:5254) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:372) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 

Das Problem ist, weil Gerät nicht Bibliothek /data/data/com.google.android.gms/files/com.google.android.gms.vision/barcode/libs/armeabi-v7a/libbarhopper.so finden, und danach habe ich bekam Ausnahme, da Gerät nicht Barcode Erkennung (Liste des Barcodes ist leer).

Hier Code:

BarcodeDetector detector = new BarcodeDetector.Builder(getApplicationContext()).build(); 
    Bitmap bitmap = ((BitmapDrawable) mBarcodeImageView.getDrawable()).getBitmap(); 
    Frame frame = new Frame.Builder().setBitmap(bitmap).build(); 
    SparseArray<Barcode> barcodes = detector.detect(frame); 

    Barcode thisCode = barcodes.valueAt(0); 
    TextView txtView = (TextView) findViewById(R.id.txtContent); 
    txtView.setText(thisCode.rawValue); 

Das Google Play-Dienst auf allen Geräten aktualisiert.

Kann mir jemand helfen? Wie kann ich es reparieren?

+0

Sieht aus wie Ihre Anwendung aufgrund einer 'ArrayIndexOutOfBoundsException' stürzt auf' MainActivity.java : 50', was überhaupt keine Google Play-Dienste sind. Was ist das für eine Linie? – ianhanniballake

+0

@ianhanniballake, Ich habe nur Google Beispielcode unten hinzugefügt. Ich erwähnte, dass die Liste der Barcodes leer ist und das ist der Grund der Ausnahme. Die Liste der Barcodes ist jedoch leer, weil "Detektor" Barcodes nicht erkennen kann und das ist ein echtes Problem. Es passiert, weil das Gerät die Bibliothek, die ich oben erwähnt habe, nicht finden kann. – stolle

+1

Siehe meine Antwort hier: http://stackoverflow.com/questions/32099530/google-vision-barcode-library-not-found/32100941#32100941 –

Antwort

0

Ich weiß, es ist spät, aber jemand kann den Fehler erhalten und diese Informationen immer noch nützlich finden.

Ihre App stürzt wegen ArrayIndexOutOfBoundsException ab. Hier ist warum:

SparseArray<Barcode> barcodes = detector.detect(frame); speichert alle erkannten data in barcodes Array. Wenn keine Daten gefunden werden, erstellt es ein leeres Array und Sie versuchen, den Wert auf Index 0 von einem leeren Array zu erhalten.

Sie sollten zuerst die Größe des Arrays überprüfen, bevor Sie versuchen, die Daten abzurufen. Ändern Sie Ihren Code zu folgenden:

int totalCodes = barcodes.size(); 
if (totalCodes > 0) { 
    Barcode thisCode = barcodes.valueAt(0); 
    TextView txtView = (TextView) findViewById(R.id.txtContent); 
    txtView.setText(thisCode.rawValue); 
} 

Oder sollten Sie eine Schleife verwenden, um alle Elemente in barcodes Array zu erhalten.

0

Die detect Methode gibt eine SparseArray, die nur die Schlüssel an die Werte enthält, sollten Sie die Ergebnisse wie folgt durchlaufen:

for (int i = 0; i < barcodes.size(); i++) { 
    Barcode barcode = barcodes.get(barcodes.keyAt(i)); 
    String value = barcode.displayValue 
} 
Verwandte Themen