I want to turn on front flash light (not with camera preview) programmatically in Android. I googled for it but the help i found referred me to this page Does anyone have any links or sample code?
3 3 3 bronze badges asked May 20, 2011 at 7:30 3,063 5 5 gold badges 19 19 silver badges 10 10 bronze badges 2021 .. It's now dead easy in modern android .. stackoverflow.com/a/66585201/294884 Commented Mar 11, 2021 at 15:10For this problem you should:
For Checking availability of flash in the device:
You can use the following:
context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);
which will return true if a flash is available, false if not.
See:
http://developer.android.com/reference/android/content/pm/PackageManager.html for more information.
For turning on/off flashlight:
I googled out and got this about android.permission.FLASHLIGHT. Android manifests' permission looks promising:
Then make use of Camera and set Camera.Parameters. The main parameter used here is FLASH_MODE_TORCH.
Code Snippet to turn on camera flashlight.
Camera cam = Camera.open(); Parameters p = cam.getParameters(); p.setFlashMode(Parameters.FLASH_MODE_TORCH); cam.setParameters(p); cam.startPreview();
Code snippet to turn off camera led light.
cam.stopPreview(); cam.release();
I just found a project that uses this permission. Check quick-settings' src code. here http://code.google.com/p/quick-settings/ (Note: This link is now broken)
Update6 You could also try to add a SurfaceView as described in this answer LED flashlight on Galaxy Nexus controllable by what API? This seems to be a solution that works on many phones.
Update 5 Major Update
I have found an alternative Link (for the broken links above): http://www.java2s.com/Open-Source/Android/Tools/quick-settings/com.bwx.bequick.flashlight.htm You can now use this link. [Update: 14/9/2012 This link is now broken]
Update 1
Update 2
Example showing how to enable the LED on a Motorola Droid: http://code.google.com/p/droidled/
Another Open Source Code :
Update 3 (Widget for turning on/off camera led)
If you want to develop a widget that turns on/off your camera led, then you must refer my answer Widget for turning on/off camera flashlight in android.
Update 4
If you want to set the intensity of light emerging from camera LED you can refer Can I change the LED intensity of an Android device? full post. Note that only rooted HTC devices support this feature.
There are also some problems while turning On/Off flashlight. eg. for the devices not having FLASH_MODE_TORCH or even if it has, then flashlight does not turn ON etc.
Typically Samsung creates a lot of problems.
You can refer to problems in the given below list:
community wikiThanks for your help, It works for me! -- I just copied the interface Flashlight and the class HtcLedFlashlight then i just call setOn method with true/false HtcLedFlashlight and that it. --- Interface-Flashlight code.google.com/p/quick-settings/source/browse/trunk/… -- Class-HtcLedFlashlight code.google.com/p/quick-settings/source/browse/trunk/…
Commented May 20, 2011 at 10:31@saiket : welcome.. if your problem is solved then mark this answer as solved. so that it can be useful to others..
Commented May 20, 2011 at 10:32 @PolamReddyRajaReddy : I think you are testing in Samsung Device. Am i correct ? Commented Nov 14, 2011 at 7:09 for permissions,the correct code in the manifest file is : `In API 23 or Higher (Android M, 6.0)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) < CameraManager camManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); String cameraId = null; try < cameraId = camManager.getCameraIdList()[0]; camManager.setTorchMode(cameraId, true); //Turn ON >catch (CameraAccessException e) < e.printStackTrace(); >>
camManager.setTorchMode(cameraId, false);
ADDITIONAL EDIT
People still upvoting my answer so I decided to post additional code This was my solution for the problem back in the day:
public class FlashlightProvider < private static final String TAG = FlashlightProvider.class.getSimpleName(); private Camera mCamera; private Camera.Parameters parameters; private CameraManager camManager; private Context context; public FlashlightProvider(Context context) < this.context = context; >private void turnFlashlightOn() < if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) < try < camManager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE); String cameraId = null; if (camManager != null) < cameraId = camManager.getCameraIdList()[0]; camManager.setTorchMode(cameraId, true); >> catch (CameraAccessException e) < Log.e(TAG, e.toString()); >> else < mCamera = Camera.open(); parameters = mCamera.getParameters(); parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH); mCamera.setParameters(parameters); mCamera.startPreview(); >> private void turnFlashlightOff() < if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) < try < String cameraId; camManager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE); if (camManager != null) < cameraId = camManager.getCameraIdList()[0]; // Usually front camera is at 0 position. camManager.setTorchMode(cameraId, false); >> catch (CameraAccessException e) < e.printStackTrace(); >> else < mCamera = Camera.open(); parameters = mCamera.getParameters(); parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF); mCamera.setParameters(parameters); mCamera.stopPreview(); >> >
answered Nov 22, 2016 at 17:45
5,960 2 2 gold badges 44 44 silver badges 40 40 bronze badges
What do you mean by "Usually front camera is at 0 position" ? How can I check which is in front and which isn't? BTW, front facing camera is the one that is directed to the current user. The back facing camera is the one that probably always has flash. And how can I check if the flash is turned on or off?
Commented Nov 25, 2018 at 15:37boolean b = getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH); This return boolean value of flash status
Commented Aug 16, 2020 at 18:00Is there a way to check which of the cameras has flashlight capabilities, and also a callback for when a flashlight is turned on/off, and the state of each?
Commented Apr 26, 2022 at 19:25 Yes, see my post below. Check if any of the CameraCharacteristic keys is FLASH_INFO_AVAILABLE Commented Aug 31, 2022 at 8:14From my experience, if your application is designed to work in both portrait and landscape orientation, you need to declare the variable cam as static. Otherwise, onDestroy() , which is called on switching orientation, destroys it but doesn't release Camera so it's not possible to reopen it again.
package com.example.flashlight; import android.hardware.Camera; import android.hardware.Camera.Parameters; import android.os.Bundle; import android.app.Activity; import android.content.pm.PackageManager; import android.view.Menu; import android.view.View; import android.widget.Toast; public class MainActivity extends Activity < public static Camera cam = null;// has to be static, otherwise onDestroy() destroys it @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); >@Override public boolean onCreateOptionsMenu(Menu menu) < // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_main, menu); return true; >public void flashLightOn(View view) < try < if (getPackageManager().hasSystemFeature( PackageManager.FEATURE_CAMERA_FLASH)) < cam = Camera.open(); Parameters p = cam.getParameters(); p.setFlashMode(Parameters.FLASH_MODE_TORCH); cam.setParameters(p); cam.startPreview(); >> catch (Exception e) < e.printStackTrace(); Toast.makeText(getBaseContext(), "Exception flashLightOn()", Toast.LENGTH_SHORT).show(); >> public void flashLightOff(View view) < try < if (getPackageManager().hasSystemFeature( PackageManager.FEATURE_CAMERA_FLASH)) < cam.stopPreview(); cam.release(); cam = null; >> catch (Exception e) < e.printStackTrace(); Toast.makeText(getBaseContext(), "Exception flashLightOff", Toast.LENGTH_SHORT).show(); >> >
to manifest I had to put this line
suggested lines above wasn't working for me.
2,916 21 21 silver badges 19 19 bronze badges answered Dec 29, 2012 at 18:30 491 5 5 silver badges 8 8 bronze badges You dont need to check for the system feature if the camera is off. If cam != null, it was turned on Commented Aug 26, 2014 at 4:25 The most helpful part for me was you need to declare the variable cam as static Commented Sep 18, 2015 at 15:06 When import Camera Class in AndroidStudio pay attention to be android.hardware class . Commented May 2, 2018 at 21:14I Got AutoFlash light with below simple Three Steps.
//Open Camera Camera mCamera = Camera.open(); //Get Camera Params for customisation Camera.Parameters parameters = mCamera.getParameters(); //Check Whether device supports AutoFlash, If you YES then set AutoFlash List flashModes = parameters.getSupportedFlashModes(); if (flashModes.contains(android.hardware.Camera.Parameters.FLASH_MODE_AUTO)) < parameters.setFlashMode(Parameters.FLASH_MODE_AUTO); >mCamera.setParameters(parameters); mCamera.startPreview();
answered Nov 14, 2013 at 10:20
35.8k 26 26 gold badges 138 138 silver badges 135 135 bronze badges
Android Lollipop introduced camera2 API and deprecated the previous camera API. However, using the deprecated API to turn on the flash still works and is much simpler than using the new API.
It seems that the new API is intended for use in dedicated full featured camera apps and that its architects didn't really consider simpler use cases such as turning on the flashlight. To do that now, one has to get a CameraManager, create a CaptureSession with a dummy Surface, and finally create and start a CaptureRequest. Exception handling, resource cleanup and long callbacks included!
To see how to turn the flashlight on Lollipop and newer, take a look at the FlashlightController in the AOSP project (try to find the newest as older use APIs that have been modified). Don't forget to set the needed permissions.
Android Marshmallow finally introduced a simple way to turn on the flash with setTorchMode.
answered Jan 20, 2015 at 14:27 4,447 2 2 gold badges 27 27 silver badges 30 30 bronze badgesThe old android.hardware.Camera API continues to function exactly as before, so there's no fundamental reason you need to use android.hardware.camera2 for flashlight. It is possible that you can reduce power consumption and CPU load with camera2, though, as you don't need to keep an active preview to enable flashlight.
Commented Jan 22, 2015 at 5:32I've tried one of the simpler implementations on two Lollipop devices and it didn't turn on the flash, even though it worked on all of several pre-Lollipop devices that I've tried it on. Perhaps that's just a bug in Lollipop. If the old methods still work for you and if you are not a Java purist continue using the old API as it is much simpler :)
Commented Jan 22, 2015 at 9:13I currently have a Nexus 5 with Lollipop and it works perfectly. I also possess an application created by myself works and is implemented with these methods. In case anyone wants to try it. I put a link to play store: play.google.com/store/apps/details?id=com.fadad.linterna The important thing is mostly well ensure that the camera is active or disable before running the flash and permissions.
Commented Feb 14, 2015 at 19:52Sorry, my mistake. Another app was probably using the camera when I tried to turn on the flash with the old API. I've updated the answer.
Commented Feb 14, 2015 at 21:54There's different ways to access Camera Flash in different Android versions. Few APIs stopped working in Lollipop and then it got changed again in Marshmallow. To overcome this, I have created a simple library that I have been using in few of my projects and it's giving good results. It's still incomplete, but you can try to check the code and find the missing pieces. Here's the link - NoobCameraFlash.
If you just want to integrate in your code, you can use gradle for that. Here's the instructions (Taken directly from the Readme) -
Step 1. Add the JitPack repository to your build file. Add it in your root build.gradle at the end of repositories:
allprojects < repositories < . maven < url "https://jitpack.io" >> >
Step 2. Add the dependency
dependencies
Initialize the NoobCameraManager singleton.
NoobCameraManager.getInstance().init(this);
You can optionally set the Log Level for debug logging. Logging uses LumberJack library. The default LogLevel is LogLevel.None
NoobCameraManager.getInstance().init(this, LogLevel.Verbose);
After that you just need to call the singleton to turn on or off the camera flash.
NoobCameraManager.getInstance().turnOnFlash(); NoobCameraManager.getInstance().turnOffFlash();
You have to take care of the runtime permissions to access Camera yourself, before initializing the NoobCameraManager. In version 0.1.2 or earlier we used to provide support for permissions directly from the library, but due to dependency on the Activity object, we have to remove it.
It's easy to toggle Flash too
if(NoobCameraManager.getInstance().isFlashOn())< NoobCameraManager.getInstance().turnOffFlash(); >else62.1k 62 62 gold badges 283 283 silver badges 449 449 bronze badges answered Oct 23, 2016 at 19:49 0xC0DED00D 0xC0DED00D 20.3k 22 22 gold badges 123 123 silver badges 194 194 bronze badges Please add support for using Context instead of Activity. Thanks! Commented Jun 30, 2017 at 6:11
@VajiraLasantha The Activity object is required for taking the permission. I was planning to remove the requirement completely by separating the permissions somehow. It's been tracked here - github.com/Abhi347/NoobCameraFlash/issues/3 In the mean time, you can modify the code to remove the requirement if you want. I may need some time to work on it.
Commented Jul 3, 2017 at 8:56Yeah I saw that. I have already altered your lib to work with Context by removing permission stuff. Because my app already does permission validations. Please let me know when you released a proper implementation that supports Context. Thanks!
Commented Jul 4, 2017 at 3:30You have to take care of the runtime permissions to access Camera yourself, before initializing the NoobCameraManager. In version 0.1.2 or earlier we used to provide support for permissions directly from the library, but due to dependency on the Activity object, we have to remove it.
Commented Jan 4, 2018 at 5:39 What if there are multiple flashes on the device? Some have on the front facing camera. Commented Nov 25, 2018 at 15:31Complete Code for android Flashlight App
import android.app.AlertDialog; import android.content.DialogInterface; import android.content.pm.PackageManager; import android.hardware.Camera; import android.hardware.Camera.Parameters; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import java.security.Policy; public class MainActivity extends AppCompatActivity < Button button; private Camera camera; private boolean isFlashOn; private boolean hasFlash; Parameters params; @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button = (Button) findViewById(R.id.button); hasFlash = getApplicationContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH); if(!hasFlash) < AlertDialog alert = new AlertDialog.Builder(MainActivity.this).create(); alert.setTitle("Error"); alert.setMessage("Sorry, your device doesn't support flash light!"); alert.setButton("OK", new DialogInterface.OnClickListener() < @Override public void onClick(DialogInterface dialog, int which) < finish(); >>); alert.show(); return; > getCamera(); button.setOnClickListener(new View.OnClickListener() < @Override public void onClick(View v) < if (isFlashOn) < turnOffFlash(); button.setText("ON"); >else < turnOnFlash(); button.setText("OFF"); >> >); > private void getCamera() < if (camera == null) < try < camera = Camera.open(); params = camera.getParameters(); >catch (Exception e) < >> > private void turnOnFlash() < if(!isFlashOn) < if(camera == null || params == null) < return; >params = camera.getParameters(); params.setFlashMode(Parameters.FLASH_MODE_TORCH); camera.setParameters(params); camera.startPreview(); isFlashOn = true; > > private void turnOffFlash() < if (isFlashOn) < if (camera == null || params == null) < return; >params = camera.getParameters(); params.setFlashMode(Parameters.FLASH_MODE_OFF); camera.setParameters(params); camera.stopPreview(); isFlashOn = false; > > @Override protected void onDestroy() < super.onDestroy(); >@Override protected void onPause() < super.onPause(); // on pause turn off the flash turnOffFlash(); >@Override protected void onRestart() < super.onRestart(); >@Override protected void onResume() < super.onResume(); // on resume turn on the flash if(hasFlash) turnOnFlash(); >@Override protected void onStart() < super.onStart(); // on starting the app get the camera params getCamera(); >@Override protected void onStop() < super.onStop(); // on stop release the camera if (camera != null) < camera.release(); camera = null; >> >