Как включить фонарик с помощью функции обнаружения штрих-кода в сервисах Google Play?

Я пытаюсь заново реализовать сканер штрих-кода Redlaser с помощью сервисов Google Play. И лицом к лицу проблема с фонариком. Объект Android hardware.Camera не может использоваться совместно с CameraSource из gms.vision. Есть ли возможность работать с фонариком и сканером штрих-кода Google?


person Splash    schedule 18.09.2015    source источник


Ответы (4)


Не уверен, что я полностью понимаю то, о чем вы спрашиваете, но мой подход к этому заключался в использовании уже созданного объекта mCamerSource и setFlashMode () оттуда, это сработало для меня, поскольку я использовал кнопку для переключения вспышки.

В вашем onCreate добавьте это или в метод createCameraSource, как в примерах ->

mCameraSource = builder
            .setFlashMode(useFlash ? Camera.Parameters.FLASH_MODE_TORCH : null)
            .build();

Затем сделайте способ переключения вспышки, надеюсь, это поможет.

private void ToggleFlash()
{
    fab_flash.startAnimation(spin_it);
    if(currentDrawalbe == FLASH_DEFAULT_STATE)
    {
        fab_flash.setImageResource(FLASH_TOGGLE_STATE);
        currentDrawalbe = FLASH_TOGGLE_STATE;
        mCameraSource.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
    }
    else
    {
        fab_flash.setImageResource(FLASH_DEFAULT_STATE);
        currentDrawalbe = FLASH_DEFAULT_STATE;
        mCameraSource.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
    }
}

CurrentDrawable - это просто изображение для значка вспышки, поэтому в основном, если изображение является включенным, вспышка выполняет предложение else, в противном случае предложение if

person wax911    schedule 18.10.2015
comment
CameraSource не имеет метода setFlashMode - person Konstantin Konopko; 15.06.2017
comment
Пожалуйста, дважды проверьте github.com/wax911/Vision-Barcode-Scanner/blob/master/ - person wax911; 15.06.2017
comment
метод setFlashMode вроде был удален :( - person ProjectDelta; 16.01.2020

Проблема заключалась в том, что API камеры не поддерживает многократное открытие камеры. Для включения фонарика и запуска CameraSource требуются отдельные вызовы для открытия камеры. Если вы попытаетесь сделать и то, и другое, то последний, запрошенный, не удастся.

Хорошая новость в том, что мы недавно открыли исходный код реализации CameraSource. В новой версии есть опция включения фонарика, которая должна решить эту проблему. Посмотреть здесь:

https://github.com/googlesamples/android-vision/blob/master/visionSamples/barcode-reader/app/src/main/java/com/google/android/gms/samples/vision/barcodereader/ui/camera/CameraSource.java

person pm0733464    schedule 18.09.2015
comment
Планируете ли вы реинтегрировать этот источник CameraSource с открытым исходным кодом обратно в официальный пакет play-services-vision? - person Greeny; 16.12.2015

В настоящее время я использую этот код для поиска объекта камеры:

private boolean findCameraObject(){
    if(mCameraSource == null) {
        return false;
    }

    Field[] declaredFields = null;
    try {
        declaredFields = CameraSource.class.getDeclaredFields();
    } catch (Exception ex) {
        ex.printStackTrace();
    }

    if(declaredFields == null) {
        return false;
    }

    for (Field field : declaredFields) {
        if (field.getType() == Camera.class) {
            field.setAccessible(true);
            try {
                Camera camera = (Camera) field.get(this.mCameraSource);
                if (camera != null) {
                    Camera.Parameters params = camera.getParameters();
                    params.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
                    camera.setParameters(params);
                    setCamera(camera);
                    return true;
                }

                return false;
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
            break;
        }
    }
    return false;
}
person Splash    schedule 22.09.2015

Я использую этот код, и он успешно работает. Замените: cameraSource.start (surfaceView.getHolder ()); ИЛИ cameraSource.start (); ДЛЯ setFlash ();

BY

import java.lang.reflect.Field;
import android.hardware.Camera;

Не забудьте AndroidManifest:

<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<permission android:name="android.permission.FLASHLIGHT"
    android:permissionGroup="android.permission-group.HARDWARE_CONTROLS"
    android:protectionLevel="normal"/>

Затем ДОБАВЬТЕ эти методы

 public static Camera getCamera(CameraSource cameraSource) {
    Field[] declaredFields = CameraSource.class.getDeclaredFields();

    for (Field field : declaredFields) {
        if (field.getType() == Camera.class) {
            field.setAccessible(true);
            try {
                Camera camera = (Camera) field.get(cameraSource);
                if (camera != null) {
                    return camera;
                }

                return null;
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }

            break;
        }
    }

    return null;
}


public void setFlash () throws IOException {
   getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);
    cameraSource.start(surfaceView.getHolder());
        Camera _cam = getCamera (cameraSource);
        if (_cam != null) {
            Camera.Parameters _pareMeters = _cam.getParameters();
            _pareMeters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
            _cam.setParameters(_pareMeters);
            _cam.startPreview();
        }
}
person حمدي هيكل    schedule 28.05.2020
comment
Все еще работаю сейчас. Спасибо - person Azizi Musa; 08.12.2020