Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Use camera flashlight in Android

I'm trying to use the cameras LED flashlight in a widget. I've found several threads about this topic (i.e. the one mentioned later..) , now I'm trying to control the light using:

Camera cam = Camera.open();      Parameters p = cam.getParameters(); p.setFlashMode(Parameters.FLASH_MODE_TORCH); cam.setParameters(p); cam.release(); 

In the AndroidManifest.xml tried different permissions, currently I have:

<uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.FLASHLIGHT"/> <uses-feature android:name="android.hardware.camera" /> <uses-feature android:name="android.hardware.camera.autofocus" /> <uses-feature android:name="android.hardware.camera.flash" /> 

I'm testing this on my Galaxy Tab as I don't have any other Android devices at hand: the light does not turn on. So I have a few questions now:

  1. Is there any way to test the led light behavior in the Emulator?
  2. Am I doing something wrong here?
  3. According to this question which deals with the same problem, it works differently on the Galaxy Tab. How?
  4. And finally, if it does work differently, I'm starting to wonder if it's just the Galaxy Tab or if other devices use different methods too. It would be hard to test then and it seems rather odd to me.

Thanks for any insight!

By the way, I quickly tested with quick-settings which gets mentioned a few times here. The flashlight doesn't work with quick-settings either.

Note that the Galaxy Tab stil uses android 2.2. I see there were some changes between 2.2 and 2.3.

Comment: I know it has to work somehow as I have found other apps in the market that work perfectly with the Galaxy Tab.

Comment 2: If I set cam.setParameters(p); and directly ask the camera for the current state with getFlashMode() it correctly returns FLASH_MODE_TORCH. However, if I release the camera and re-open it, it returns FLASH_MODE_OFF. It's almost as if the Camera object aknowledges the request but doesn't really pass it on to the hardware!?

--

After Konstantins comment, I removed the cam.release(); part. He is right, the settings are not persisted if you release the camera. If you use cam.open() again, you will get a fresh instance with the light off. The light's still not working on the galaxy tab though. So, I guess it's hard to keep the light on if you're trying to control it through a widget then. As soon as the background service is finished, the camera object is released automatically and therefore the light switches off again. My questions still remain, especially why the camera doesn't switch on in the first place.

like image 429
pgruetter Avatar asked Mar 31 '11 16:03

pgruetter


People also ask

What is camera torch?

PV-LG60HD is a handy torch with a built-in video camera which enables quick video recording and taking photos regardless of the time of the day or weather conditions.


2 Answers

Every device is a bit different. Samsung especially likes to make things complicated for app developers.

On the Galaxy Tab you should be good with:

Camera cam; void ledon() {     cam = Camera.open();          Parameters params = cam.getParameters();     params.setFlashMode(Parameters.FLASH_MODE_ON);     cam.setParameters(params);     cam.startPreview();     cam.autoFocus(new AutoFocusCallback() {                 public void onAutoFocus(boolean success, Camera camera) {                 }             }); }  void ledoff() {     cam.stopPreview();     cam.release(); } 

If that doesn't work then it might be a matter of setting FLASH_MODE_OFF initially and changing it after the startPreview.

like image 83
Kevin TeslaCoil Avatar answered Oct 13 '22 01:10

Kevin TeslaCoil


You must not release the camera after setting the parameters. I found that flash is activated (in torch mode) after I have started the preview. ( Applies to motorola defy, 2.1 )

It is also a good idea to check supported flash modes, before trying to activate them.

Messing around with camera settings on android is darkest voodoo: Many devices behave differently and there seems to be no reliable way of targeting them all with one piece of code. Safest bet is to always set up your camera properly when your onResume() method is called. I would also consider doing the same in onConfigChange(), because at least Motorola screen locker can force your application into portrait mode, restarting it completely.

P.s. I suppose that when you close the camera, the native camera app is closed and then recreated in a fresh state.

like image 32
Konstantin Pribluda Avatar answered Oct 13 '22 03:10

Konstantin Pribluda