首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用谷歌视觉BarCode阅读器访问自动对焦/闪光

使用谷歌视觉BarCode阅读器访问自动对焦/闪光
EN

Stack Overflow用户
提问于 2016-03-05 15:31:49
回答 3查看 8.7K关注 0票数 8

我在这里使用了BarCode扫描器的原始示例:

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

他们可以在相机工厂中启动自动聚焦/Flash,如下所示:

代码语言:javascript
运行
复制
    // Creates and starts the camera.  Note that this uses a higher resolution in comparison
    // to other detection examples to enable the barcode detector to detect small barcodes
    // at long distances.
    CameraSource.Builder builder = new CameraSource.Builder(getApplicationContext(), barcodeDetector)
            .setFacing(CameraSource.CAMERA_FACING_BACK)
            .setRequestedPreviewSize(1600, 1024)
            .setRequestedFps(15.0f);

    // make sure that auto focus is an available option
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
        builder = builder.setFocusMode(
                autoFocus ? Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE : null);
    }

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

但是,cameraSource构建器上的此方法在当前版本中已不存在,因此无法访问此设置。此外,我需要在使用过程中更改FlashMode,所以这也不是做这件事的方法。我找到了访问摄像头的这个丑陋的解决方案:

代码语言:javascript
运行
复制
public static Camera getCamera(@NonNull 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;
}

虽然它可以工作,但它没有帮助:当调用getParameters().setFocusMode()时,我得到了这个异常:

代码语言:javascript
运行
复制
Attempt to invoke virtual method 'android.hardware.Camera$Parameters android.hardware.Camera.getParameters()' on a null object reference

显然,我所做的不是一种正确的方法,但似乎没有关于它的文档。

谢谢你的提示。

EN

回答 3

Stack Overflow用户

发布于 2016-12-01 18:57:57

只需如下优化您的代码,您必须在构建Camera Source类之后调用此方法。

代码语言:javascript
运行
复制
private Camera camera = null;
boolean flashmode=false;
private void flashOnButton() {
    camera=getCamera(mCameraSource);
    if (camera != null) {
        try {
            Camera.Parameters param = camera.getParameters();
         param.setFlashMode(!flashmode?Camera.Parameters.FLASH_MODE_TORCH :Camera.Parameters.FLASH_MODE_OFF);
            camera.setParameters(param);
            flashmode = !flashmode;
            if(flashmode){
                showToast("Flash Switched ON");
            }
            else {
                showToast("Flash Switched Off");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}
private static Camera getCamera(@NonNull 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;
}

这将帮助您使用camerasource对象在Google Vision Api中启用闪光灯。

票数 16
EN

Stack Overflow用户

发布于 2020-09-16 21:47:58

下面是一个可用的kotlin变体:

代码语言:javascript
运行
复制
private var flashmode: Boolean = false
private var camera: Camera? = null

private fun flashOnButton() {
    camera = getCamera(cameraSource)

    if (camera != null) {
        try {
            val param = camera!!.parameters

            param.setFlashMode(if (!flashmode) Camera.Parameters.FLASH_MODE_TORCH else Camera.Parameters.FLASH_MODE_OFF)
            camera?.parameters = param
            flashmode = !flashmode
        } catch (e: java.lang.Exception) {
            e.printStackTrace()
        }
    }
}

private fun getCamera(cameraSource: CameraSource): Camera? {
    val declaredFields = CameraSource::class.java.declaredFields

    for (field in declaredFields) {
        if (field.type === Camera::class.java) {
            field.isAccessible = true

            try {
                val camera = field.get(cameraSource) as Camera
                return if (camera != null) {
                    camera
                } else null
            } catch (e: IllegalAccessException) {
                e.printStackTrace()
            }

            break
        }
    }

    return null
}

此解决方案目前有效。但我不知道该如何处理这个问题,因为将来不再支持android.hardware.Camera了。也许没有android.hardware.Camera还有更好的解决方案

票数 0
EN

Stack Overflow用户

发布于 2018-04-04 20:28:43

只需直接使用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

你将有能力使用闪光灯/焦点。

代码语言:javascript
运行
复制
CameraSource
.setFlashMode()
.setFocusMode()
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35811411

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档