Flashlight control in Marshmallow

≯℡__Kan透↙ 提交于 2019-12-03 05:38:40

Google has introduced torchmode in OS 6 (Android M).
if your purpose is only to turn on/off the flash, below code can help you with that:

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

All you have to do is: Get cameraid's list out of which camera ID zero(0) is your primary camera for which you want to turn flash on/off. Simply pass the cameraID to setTochMode API with boolean value for turning it on or off.

Do note that this piece of code will work only with OS 6, so you need to check for device OS and based upon that you need to select which API's to call for pre-marshmallow devices.

Kindly mark this as solution if it solves your problem.

yeberiah

As Saurabh7474 has responded, to check the version of Android and use setTorchMode API it's very correct.

Although you can also use params.setFlashMode (...) in marshmallow using

mCamera.setPreviewTexture (new SurfaceTexture (100))

after Camera.open (...) and before calling 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());
            }

then when you want, you can use

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

My answer is based on CameraSource examples of Vision API that uses params.setFlashMode (...) and works in Api 23 and above. If you decide to inspect CameraSource, the key method that has solved the same problem is "start ()", in the line 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

The reason you can find here https://stackoverflow.com/a/33333046/4114846

Update your app to check for permissions at runtime. You have to have android.permission.CAMERA granted. Including it in the manifest of your app is not going to grant it to you on Marshmallow. You'll need to detect whether or not it has been granted and request it.

Building off of Saurabh7474's answer, you can toggle Marshmallow's torchMode by registering a torchCallback:

 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);
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!