棉花糖中的手电筒控制

时间:2015-10-22 14:02:43

标签: android camera android-camera android-6.0-marshmallow flashlight

我在最近的Marshmallow版本中遇到了相机问题,更具体地说是手电筒。 在任何预先Marshmallow版本上,我需要做的就是打开/关闭闪光灯:

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

不幸的是,Marshmallow设备开始在野外崩溃。不知何故,camera.getParameters()camera.setParameters()开始失败的消息如下:

  

RuntimeException:getParameters失败(空参数)

     

RuntimeException:setParameters失败

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

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

有关如何可靠地打开/关闭Marshmallow手电筒的任何建议吗?

4 个答案:

答案 0 :(得分:6)

谷歌在OS 6(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();
    }
}

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

请注意,这段代码仅适用于OS 6,因此您需要检查设备操作系统,并根据您需要选择要为预棉花糖设备调用的API。

如果能解决您的问题,请将此标记为解决方案。

答案 1 :(得分:1)

作为Saurabh7474 has responded,要检查Android的版本并使用setTorchMode API,这是非常正确的。

虽然您也可以使用

在marshmallow中使用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);

我的回答是基于使用params.setFlashMode(...)并在Api 23及以上版本中工作的Vision API的CameraSource示例。 如果您决定检查CameraSource,解决相同问题的关键方法是&#34; start()&#34;,在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

答案 2 :(得分:0)

更新您的应用以在运行时检查权限。你必须获得x <- rnorm(100) out <- rep(1:10, each = 10)[order(order(x))] 。将它包含在您应用的清单中并不会在Marshmallow上将其授予您。您需要检测它是否已被授予并请求它。

答案 3 :(得分:0)

建立Saurabh7474的答案,你可以通过注册一个火炬来回切换Marshmallow的火炬模式:

 final CameraManager mCameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
 CameraManager.TorchCallback torchCallback = new CameraManager.TorchCallback() {
     @Override
     public void onTorchModeUnavailable(String cameraId) {
         super.onTorchModeUnavailable(cameraId);
     }

     @Override
     public void onTorchModeChanged(String cameraId, boolean enabled) {
         super.onTorchModeChanged(cameraId, enabled);
         boolean currentTorchState = enabled;
         try {
             mCameraManager.setTorchMode(cameraId, !currentTorchState);
         } catch (CameraAccessException e){}



     }
 };

 mCameraManager.registerTorchCallback(torchCallback, null);//fires onTorchModeChanged upon register
 mCameraManager.unregisterTorchCallback(torchCallback);
相关问题