在zxing中设置摄像机参数的闪光模式时在android中参数失败异常

时间:2012-06-07 07:23:42

标签: android android-camera zxing barcode-scanner

我在Android中使用zxing整合条形码扫描功能,我的应用程序包括按下按钮打开/关闭闪光灯功能。

按下闪光灯按钮时,将闪光灯设定为模式割炬,该参数设定为相机参数。我有一个例外:Set Paramters failed exception.

这是我的代码。

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

我遇到以下异常:

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)

请告诉我如何解决此问题?

7 个答案:

答案 0 :(得分:3)

我的Google Nexus One遇到了同样的问题。 通过取消自动对焦,设置参数然后重置自动对焦

,我解决了这个问题
camera.cancelAutoFocus();
camera.setParameters(parameters);
camera.autoFocus(autoFocusCallback);

不幸的是,它不是一个普遍的解决方法,因为它不适用于完全失去它的S3或Galaxy Nexus ...... S-G开始闪烁,S3停止自动对焦。 我通过停止预览然后在设置参数后重新启动来解决S3的问题

答案 1 :(得分:2)

我遇到了同样的问题,当同时设置参数时(特别是当您的自动对焦间隔较低时),打开相机的闪光灯会导致一些自动对焦碰撞。 在启用/禁用手电筒之前粘贴此权限,它会减慢启用事件,但是嘿,没有崩溃(尽管不是100%防撞)。

//睡眠时间应该很长,3000毫秒应该足以防止某些设备崩溃,2000可能会一点一点(仍然在索尼Xperia设备上崩溃) - 我不知道这是否有效:D

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

编辑: 解决此问题的更好方法是将setParameters方法放在循环中,并每次捕获运行时异常。没有异常时,或者(可选)循环计数器达到最大值时退出循环。

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) {

 }
}

答案 2 :(得分:0)

某些设备不支持并出现此类问题。您可以参考下面的链接,以便您可以清楚地了解它。 How to turn on camera flash light programmatically in Android?

答案 3 :(得分:0)

一种有效的解决方案是创建摄像机参数队列。设置火炬会为队列添加火炬参数。

在onAutoFocus回调中,调用一个迭代所有队列项并提交它们的函数。这样可以保证您不会自动对焦。

答案 4 :(得分:0)

  

打开相机/ trouch上的闪光灯(FLASH_MODE_TORCH)   在设置参数时会导致一些自动对焦碰撞   同一时间(特别是当你的自动对焦间隔很低时)。

我不喜欢线程解决方法。所以我就这样修好了

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

现在没有RuntimeException。

但是在一些adroid设备上仍然存在FLASH_MODE_TORCH + autoFocus错误,例如Motorala Milestone / Samsun I9100G / Blahblah ......

另请参阅针对Android的已拒绝问题:https://code.google.com/p/android/issues/detail?id=14360

顺便说一句。 ZBar比ZXing快:)

答案 5 :(得分:0)

我想在扫描开始时启动闪光灯并用此解决。

我在com.google.zxing.client.android.camera方法中更改了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;
}

比我从com.google.zxing.client.android.camera.CameraConfigurationManager中删除了

initializeTorch(参数,prefs);

最终我改变了AndroidManifest.xml

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

答案 6 :(得分:-1)

试试这段代码。它对我很好。

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

 }
}