我在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)
请告诉我如何解决此问题?
答案 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;
}
}
}