如何使用Google Play服务中的条形码检测功能打开手电筒?

问题描述 投票:3回答:4

我正在尝试使用Google Play服务重新实现Redlaser条码扫描器。并面对手电筒的问题。 Android hardware.Camera对象不能与gms.vision中的CameraSource共同使用。有机会使用手电筒和Google条码扫描器吗?

android google-play-services barcode-scanner flashlight google-vision
4个回答
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子句


3
投票

问题是相机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


2
投票

当前,我正在使用此代码查找相机对象:

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

0
投票

我正在使用此代码,它正在成功运行替换为:cameraSource.start(surfaceView.getHolder());或cameraSource.start(); TO setFlash();并添加此方法通过导入java.lang.reflect.Field;导入android.hardware.Camera;

 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();
        }
}
© www.soinside.com 2019 - 2024. All rights reserved.