Manikandan
Manikandan

Reputation: 107

When Setting Flash Mode for Camera Paramters in zxing set Parameters failed exception in android

I am integrating barcode scanning functionality using zxing in android, my app includes turn on/off flash light functionality by button press.

When the flash button is pressed it sets the flash to mode torch and that parameter is set to be a camera parameter. I got an exception: Set Paramters failed exception.

Here is my code.

    Parameters p = camera.getParameters();
    List<String> supportedFlashModes =p.getSupportedFlashModes();

    if (active)
    {
        if(supportedFlashModes!= null)
        {
            if(supportedFlashModes.contains(Parameters.FLASH_MODE_TORCH))
            {
                p.setFlashMode(Parameters.FLASH_MODE_TORCH);
            }
        }
        CaptureActivity.flashLightON=true;
    }
    else
    {
        p.setFlashMode(Parameters.FLASH_MODE_OFF);
    }
    camera.setParameters(p);

I got the following exception:

06-07 12:15:26.107: E/AndroidRuntime(24642): FATAL EXCEPTION: main
06-07 12:15:26.107: E/AndroidRuntime(24642): java.lang.RuntimeException:
 setParameters failed
06-07 12:15:26.107: E/AndroidRuntime(24642):    at 
 android.hardware.Camera.native_setParameters(Native Method)

Please advice me how to resolve this issue?

Upvotes: 3

Views: 9522

Answers (7)

Marcel Behan
Marcel Behan

Reputation: 1

I wanted to start the flash light at the start of scanning and solve it with this.

I have changed in com.google.zxing.client.android.camera method openDriver

Camera theCamera = camera;
if (theCamera == null) {
 theCamera = Camera.open();
  if (theCamera == null) {
   throw new IOException();
  }
  final Parameters p = theCamera.getParameters();
  p.setFlashMode(Parameters.FLASH_MODE_TORCH);
  theCamera.setParameters(p);
  camera = theCamera;
}

than I have removed from com.google.zxing.client.android.camera.CameraConfigurationManager

initializeTorch(parameters, prefs);

finaly I have changed AndroidManifest.xml

<uses-feature android:name="android.hardware.camera.flash" android:required="true"/>

Upvotes: 0

twinsant
twinsant

Reputation: 71

turning the flaslight with the camera on/trouch (FLASH_MODE_TORCH) causes some autofocus collision, when setting the parameters at the same time (especially when your autofocus interval is low).

I don't like the thread workaround. So I fixed it like this

...
private Boolean _flashOn = null;
...
private Runnable doAutoFocus = new Runnable() {
        public void run() {
            if (previewing) {
                if (_flashOn != null) {
                    Parameters p = mCamera.getParameters();
                    if (_flashOn) {
                        p.setFlashMode(Parameters.FLASH_MODE_TORCH);
                    }else{
                        p.setFlashMode(Parameters.FLASH_MODE_OFF);
                    }
                    mCamera.setParameters(p);
                    _flashOn = null;
                }
                mCamera.autoFocus(autoFocusCB);
            }
        }
    };

No RuntimeException now.

But still has FLASH_MODE_TORCH + autoFocus bug on some adroid devices, e.g. Motorala Milestone/Samsun I9100G/Blahblah...

See also a declined issue for Android: https://code.google.com/p/android/issues/detail?id=14360

BTW. ZBar is faster than ZXing :)

Upvotes: 0

Bartosz K
Bartosz K

Reputation: 61

I had the same problem, turning the flaslight with the camera on causes some autofocus collision, when setting the parameters at the same time (especially when your autofocus interval is low). Paste this right before enabling/disabling the flashlight, it will slow down the enabling event, but hey, no crash (not 100% crash proof though).

//sleep time should be long, 3000ms should be enough to prevent crash on some devices, 2000 may by to little (still crashes on Sony Xperia devices) - I have no idea wy this works that way :D

try {
       Thread.currentThread().sleep(3000);
       }
     catch (InterruptedException e) {
       e.printStackTrace();
       }

Edit: Better way to solve this problem, is to put your setParameters method in a loop, and catch runtime exception everytime. Exit the loop when there is no exception, or when your (optional) loop counter reaches max value.

final int MAX_TRIES = 100;
boolean success = false;
int triesCounter = 0;
while (!success) {
 try {
 triesCounter++;
 if (triesCounter > MAX_TRIES) {
 success = true;
 }
 parameters = camera.getParameters();
 if (parameters != null) {
  parameters.setFlashMode(Parameters.FLASH_MODE_OFF);
  camera.setParameters(parameters);
 }
 success = true;
 } catch (Exception exception) {

 }
}

Upvotes: 2

Supahfly
Supahfly

Reputation: 819

I had the same problem with my Google Nexus One. The problem was solved for me by canceling autofocus, set parameters and then reset autofocus

camera.cancelAutoFocus();
camera.setParameters(parameters);
camera.autoFocus(autoFocusCallback);

Unfortunately its not an universal workaround since it does not work for S3 or Galaxy Nexus who totally loses it... S-G starts to flashes and S3 stop autofocus. I solved the issue for S3 by stoping preview and then restarting after the parameters were set

Upvotes: 3

Error 454
Error 454

Reputation: 7315

One solution that works is to create a queue of camera parameters. Setting the torch would add a torch parameter to the queue.

Inside the onAutoFocus callback, call a function that iterates through all of the queue items and commits them. This way you are guaranteed that you are not autofocusing.

Upvotes: 0

Sagar Patil
Sagar Patil

Reputation: 1400

Try out this code. It worked fine with me.

private void turnOnFlashLight(){
if (!pm.hasSystemFeature(PackageManager.FEATURE_CAMERA)) 
{
    //Check for Device Camera
    Toast.makeText(this, getString(R.string.no_device_camera_msg), Toast.LENGTH_SHORT).show();
    flashLightControl.setChecked(false);
    return;

}else if (!pm.hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH)) 
{
    //Check for Camera flash
    Toast.makeText(this, getString(R.string.no_camera_flash), Toast.LENGTH_SHORT).show();
    flashLightControl.setChecked(false);
    return;

}else
{
    //BIG ISSUE Fash mode is device specific
    //Turn On Flash
    String _model = android.os.Build.MODEL;
    String _manufaturer = android.os.Build.MANUFACTURER;
    if((_model.contains("GT-S5830") && _manufaturer.contains("samsung"))) //|| (_manufaturer.contains("lge")))
    {

        new Thread(new Runnable() 
        {

            @Override
            public void run() 
            {
                // TODO Auto-generated method stub
                Log.d(TAG, "From TimerTask..!!!");
                cameraParams = CameraManager.camera.getParameters();
                //cameraParams.setFlashMode(Parameters.FLASH_MODE_TORCH);
                cameraParams.set("flash-mode", "on");
                CameraManager.camera.setParameters(cameraParams);
                CameraManager.camera.startPreview();
                isFlash_On_Mode_Device = true;
                isLightOn = true;
                try{
                    Thread.sleep(2000);
                    Log.d(TAG, "From TimerTask After sleep!!!");
                    cameraParams = CameraManager.camera.getParameters();
                    cameraParams.setFlashMode(Parameters.FLASH_MODE_OFF);
                    CameraManager.camera.setParameters(cameraParams);
                    CameraManager.camera.startPreview();
                    isLightOn = true;
                } 
                  catch(Exception e){}



            }
        }).start();

    }else if(_manufaturer.contains("lge"))
    {
        //Log.d(TAG, "From LG");
        cameraParams = CameraManager.camera.getParameters();
        cameraParams.setFlashMode(Parameters.FLASH_MODE_ON);
        CameraManager.camera.setParameters(cameraParams);
        CameraManager.camera.startPreview();
        isLightOn = true;
    }
    else  if(CameraManager.camera != null)
    {
        cameraParams = CameraManager.camera.getParameters();
        //cameraParams.setFlashMode(Parameters.FLASH_MODE_TORCH);
        cameraParams.set("flash-mode", "torch");
        CameraManager.camera.setParameters(cameraParams);
        CameraManager.camera.startPreview();
        isLightOn = true;
            }
}
private void turnOffFlashLight()
{
if (isLightOn) 
{

    if(CameraManager.camera != null)
    {
        if(isFlash_On_Mode_Device)
        {
            CameraManager.get().closeDriver();
            SurfaceHolder surfaceHolder = surfaceView.getHolder();
            if (hasSurface) 
            {
                initCamera(surfaceHolder);
                if(CameraManager.camera != null)
                    CameraManager.camera.startPreview();
            } 
            //Log.d(TAG, "Stopping camera..!!!");
        }else
        {
            cameraParams = CameraManager.camera.getParameters();
            cameraParams.setFlashMode(Parameters.FLASH_MODE_OFF);
            CameraManager.camera.setParameters(cameraParams);
            CameraManager.camera.startPreview();
        }

        isLightOn = false;
        isFlash_On_Mode_Device = false;
    }

 }
}

Upvotes: -1

user1383885
user1383885

Reputation:

Some of the devices do not support and gives such problems. You can refer the link bellow, so that you can get a clear idea about it. How to turn on camera flash light programmatically in Android?

Upvotes: 0

Related Questions