[英]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.