3

我在 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)

请告诉我如何解决这个问题?

4

7 回答 7

3

我的 Google Nexus One 也有同样的问题。通过取消自动对焦,设置参数然后重置自动对焦为我解决了这个问题

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

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

于 2012-12-21T14:15:03.330 回答
2

我遇到了同样的问题,在同时设置参数时(尤其是当您的自动对焦间隔较低时),打开相机的手电筒会导致一些自动对焦碰撞。在启用/禁用手电筒之前将其粘贴,它会减慢启用事件的速度,但是嘿,没有崩溃(虽然不是 100% 防崩溃)。

//睡眠时间应该很长,3000ms 应该足以防止某些设备崩溃,2000 可能很少(在 Sony 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) {

 }
}
于 2012-09-14T10:51:28.367 回答
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 中删除

初始化火炬(参数,首选项);

最后我改变了 AndroidManifest.xml

<uses-feature android:name="android.hardware.camera.flash" android:required="true"/>
于 2014-08-29T11:03:59.193 回答
0

当同时设置参数时(特别是当您的自动对焦间隔较低时),打开/打开相机(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。

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

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

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

于 2013-06-27T02:11:17.693 回答
0

一种可行的解决方案是创建一个相机参数队列。设置火炬会将火炬参数添加到队列中。

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

于 2012-10-15T21:51:11.410 回答
0

一些设备不支持并给出这样的问题。您可以参考下面的链接,以便您可以清楚地了解它。 如何在 Android 中以编程方式打开相机闪光灯?

于 2012-06-07T08:07:59.067 回答
-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;
    }

 }
}
于 2012-06-07T12:08:59.190 回答