繁体   English   中英

在zxing中为相机参数设置Flash模式时在android中设置参数失败异常

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

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

请建议我如何解决这个问题?

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

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

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

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

//睡眠时间应该很长,3000 毫秒应该足以防止在某些设备上崩溃,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) {

 }
}

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

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

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

当同时设置参数时(尤其是当您的自动对焦间隔很低时),在相机打开/触碰(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);
            }
        }
    };

现在没有运行时异常。

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

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

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

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

我已经改变了 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"/>

我希望你正在使用下面的库

implementation 'com.google.zxing:core:3.4.0'
implementation 'com.journeyapps:zxing-android-embedded:4.0.0'

如果您使用的是DecoratedBarcodeView,则可以实现Flash选项,如下所示

<com.journeyapps.barcodescanner.DecoratedBarcodeView
                android:id="@+id/barcodeView"
                android:layout_width="match_parent"
                android:layout_height="match_parent" />

在活动或片段中创建一个成员变量以跟踪闪存状态

private var isFlashOn = false

初始化条形码视图并设置割炬监听器

barcodeView = rootView.findViewById(R.id.barcodeView)
barcodeView.setStatusText("")

barcodeView.setTorchListener(this)

iv_flash_toggle.setOnClickListener{
    toggleFlash(!isFlashOn)
}

确保您的活动或片段实现以下两种方法。 更新成员变量以跟踪是否打开或关闭闪光灯

override fun onTorchOff() {
    isFlashOn = false
}

override fun onTorchOn() {
    isFlashOn = true
}

希望对您有所帮助,快乐编码:)

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

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

 }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM