手电筒控制在棉花糖

我在最近的棉花糖建造中的相机有问题,更具体地说是手电筒。 在任何棉花糖前版本中,我需要做的以打开/关闭闪光灯如下:

private void turnFlashOn(final Camera camera, int flashLightDurationMs) {
    if (!isFlashOn()) {
        final List<String> supportedFlashModes = camera.getParameters().getSupportedFlashModes();
        if (supportedFlashModes != null && supportedFlashModes.contains(Camera.Parameters.FLASH_MODE_TORCH)) {
            mParams.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
            camera.setParameters(mParams);
        }
    }
}

private void turnFlashOff(Camera camera) {
    if (camera != null) {
        final List<String> supportedFlashModes = camera.getParameters().getSupportedFlashModes();
        if (supportedFlashModes != null && supportedFlashModes.contains(Camera.Parameters.FLASH_MODE_OFF)) {
            mParams.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
            camera.setParameters(mParams);
        }
    }
}

不幸的是,棉花糖设备开始在野外坠毁。 不知何故, camera.getParameters()camera.setParameters()开始失败,消息如下:

RuntimeException:getParameters失败(空参数)

RuntimeException:setParameters失败

我在获取参数之前尝试启动并停止预览,这些参数不再引发错误。 但是,当我调用camera.startPreview()时不会恢复预览。

我担心释放相机并重新打开它是不可能的,因为这需要几秒钟的时间,并且会产生不好的体验。

关于如何可靠地打开/关闭棉花糖手电筒的任何建议?


Google已经在OS 6中引入了torchmode(Android M)。
如果你的目的只是打开/关闭闪光灯,下面的代码可以帮助你:

private static void handleActionTurnOnFlashLight(Context context){
    try{

        CameraManager manager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);
        String[] list = manager.getCameraIdList();
        manager.setTorchMode(list[0], true);
    }
    catch (CameraAccessException cae){
        Log.e(TAG, cae.getMessage());
        cae.printStackTrace();
    }
}

private static void handleActionTurnOffFlashLight(Context context){
    try{
        CameraManager manager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);
        manager.setTorchMode(manager.getCameraIdList()[0], false);
    }
    catch (CameraAccessException cae){
        Log.e(TAG, cae.getMessage());
        cae.printStackTrace();
    }
}

您所要做的只是:获取cameraid的列表,其中摄像机ID零(0)是您想要打开/关闭闪光灯的主摄像机。 只需将cameraID传递给setTochMode API,并使用布尔值打开或关闭它。

请注意,这段代码只能与OS 6一起工作,因此您需要检查设备操作系统,并根据该代码选择要调用哪些API来使用棉花糖前设备。

如果它解决了您的问题,请将其标记为解决方案。


正如Saurabh7474已经回应,检查Android的版本并使用setTorchMode API是非常正确的。

虽然你也可以在棉花糖中使用params.setFlashMode(...)

mCamera.setPreviewTexture (new SurfaceTexture (100))

在Camera.open(...)之后并在调用mCamera.startPreview()之前;

try {
                Log.i(TAG, "getCamera");
                int requestedCameraId = getIdForRequestedCamera(mFacing);
                if (requestedCameraId == -1) {
                    throw new RuntimeException("Could not find requested camera.");
                }
                mCamera = Camera.open(requestedCameraId);
                mCamera.setPreviewTexture(new SurfaceTexture(DUMMY_TEXTURE_NAME));
                params = mCamera.getParameters();
            } catch (RuntimeException e) {
                Log.e("Failed to Open. Error:", e.getMessage());
            } catch (IOException e) {
                Log.e("Failed to Open. can't setPreviewTexture:", e.getMessage());
            }

那么当你想要的时候,你可以使用

        mParams.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
        camera.setParameters(mParams);

我的回答是基于Camera API的CameraSource示例,该示例使用params.setFlashMode(...)并在Api 23及更高版本中工作。 如果您决定检查CameraSource,解决同样问题的关键方法是“start()”,在行312中...

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

你可以在这里找到https://stackoverflow.com/a/33333046/4114846


更新您的应用程序以在运行时检查权限。 你必须授予android.permission.CAMERA 。 将它包含在应用程序的清单中是不会将它授予给你的棉花糖的。 你需要检测它是否被授予并请求它。

链接地址: http://www.djcxy.com/p/90941.html

上一篇: Flashlight control in Marshmallow

下一篇: Android Camera Error 5001