Библиотека сканера штрих-кода Android Google Play Service Vision не найдена

Я использую Visible API сервисов Google play для считывания штрих-кодов. Я попробовал код из официального примера CodeLabs, который не работает на некоторых (совсем нет) устройств. Вот сообщение Logcat:

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)

Проблема в том, что устройство не может найти библиотеку /data/data/com.google.android.gms/files/com.google.android.gms.vision/barcode/libs/armeabi-v7a/libbarhopper.so, и после этого я получил исключение, потому что устройство не обнаруживает штрих-код (список штрих-кодов пуст).

Вот код:

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

Сервис Google Play обновлен на всех устройствах.

Может кто-нибудь мне помочь? Как я могу это исправить?


person stolle    schedule 18.08.2015    source источник
comment
Похоже, ваше приложение вылетает из-за ArrayIndexOutOfBoundsException на MainActivity.java:50, который вообще не связан с сервисами Google Play. Что это за линия?   -  person ianhanniballake    schedule 18.08.2015
comment
@ianhanniballake, я только что добавил пример кода Google ниже. Я упомянул, что список штрих-кодов пуст, и это причина исключения. Но список штрих-кодов пуст, потому что detector не может распознать штрих-коды, и это настоящая проблема. Это происходит потому, что устройство не может найти библиотеку, о которой я упоминал выше.   -  person stolle    schedule 19.08.2015
comment
См. Мой ответ здесь: ​​stackoverflow .com / questions / 32099530 /   -  person Jared Burrows    schedule 19.08.2015
comment
@JaredBurrows спасибо! Я исправил проблему. На самом деле мне нужно очистить кеш, освободить место и переустановить приложение.   -  person stolle    schedule 21.08.2015


Ответы (2)


Я знаю, что уже поздно, но кто-то может получить сообщение об ошибке и найти эту информацию полезной.

Ваше приложение вылетает из-за ArrayIndexOutOfBoundsException. Вот почему:

SparseArray<Barcode> barcodes = detector.detect(frame); сохраняет все обнаруженные data в barcodes массиве. Когда данные не найдены, создается пустой массив, и вы пытаетесь получить значение индекса 0 из пустого массива.

Вы должны сначала проверить размер массива, прежде чем пытаться получить данные. Измените свой код на следующий:

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

Или вы должны использовать цикл, чтобы получить все элементы в массиве barcodes.

person arvinchhi    schedule 26.12.2015

Метод detect возвращает SparseArray, который содержит только ключи к значениям, вы должны перебирать результаты следующим образом:

for (int i = 0; i < barcodes.size(); i++) {
    Barcode barcode = barcodes.get(barcodes.keyAt(i));
    String value = barcode.displayValue
}
person Fernando Gallego    schedule 04.01.2017