2012-06-07 2 views
3

Я интегрирую функцию сканирования штрих-кода с помощью zxing в android, мое приложение включает в себя включение/выключение функции вспышки при нажатии кнопки.При установке режима вспышки для параметров камеры в zxing set Параметр сбойной ошибки в android

При нажатии кнопки вспышки он устанавливает вспышку в режим резака, и этот параметр установлен как параметр камеры. У меня есть исключение: 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

вы должны разместить больше кода. например, где вы получаете камеру (и как) ... и т. д. –

+0

Я использовал код сканирования штрих-кода zxing как таковой. – Manikandan

+0

Извините, я не знаком с этим. –

ответ

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

} 
} 
+0

Привет, этот код работает для Android ICS ?. Поскольку Thread.sleep() устарел в android ICS. – Manikandan

+0

Да, я тестировал его на Nexus с ICS 4.0.3, и он отлично работает. –

+0

Хорошо. Мы явно вызываем поток, чтобы ждать 2 секунды. он вызывает черный экран при запуске страницы камеры. – Manikandan

2

У меня был та же проблема, поворачивая flaslight с камерой по причинам некоторой автофокусировки столкновение, при установке параметров в то же время (особенно если интервал автофокусировки низкий). Вставьте это право перед включением/отключением фонарика, это замедлит срабатывающее событие, но эй, никаких сбоев (не 100% -ное краш-доказательство, хотя).

// время сна должна быть длинной, 3000ms должно быть достаточно, чтобы предотвратить аварии на некоторых устройствах, 2000 мая в мало (по-прежнему падает на устройствах Sony Xperia) - я понятия не имею, WY это не работает таким образом: 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) { 

} 
} 
+1

Ofc это не окончательное решение проблемы, кто-то должен заглянуть в весь автофокус wibbly шаткий материал. –

+0

и помните, что сон в потоке пользовательского интерфейса не является хорошей идеей, читайте об asynctask –

0

Одним из решений, которое работает, является создание очереди параметров камеры. Установка факела добавит параметр факела в очередь.

Внутри обратного вызова onAutoFocus вызывается функция, которая выполняет итерацию через все элементы очереди и фиксирует их. Таким образом, вам гарантируется, что вы не автофокусируетесь.

3

У меня была такая же проблема с моим Google Nexus One. проблема была решена для меня отмена автофокусировку, установить параметры, а затем сбросить автофокусировка

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

К сожалению, его не универсальный обходной путь, поскольку он не работает на S3 или Galaxy Nexus, который полностью теряет его ... начинается SG мигает, а S3 останавливает автофокусировку. Я решил проблему для S3, останавливая просмотр, а затем перезапустить после того, как параметры были установлены

0

поворота flaslight с камерой на/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); 
      } 
     } 
    }; 

No RuntimeException сейчас.

Но на некоторых устройствах adroid по-прежнему имеется ошибка FLASH_MODE_TORCH + autoFocus. Motorala Milestone/Самсун I9100G/Blahblah ...

Смотрите также отклоненный вопрос для Android: https://code.google.com/p/android/issues/detail?id=14360

BTW. ZBar быстрее, чем ZXing :)

+0

cancelAutoFocus неприемлемо для ZBar или ZXing. – twinsant

+0

ошибка: OK [SONY C6503, MI-ONE Plus] NG [Motorala Milestone2, Samsun I9100G] – twinsant

+0

ошибка: OK [SONY C6503, MI-ONE Plus, Lenovo K800, HTC Desire HD] NG [Motorala Milestone2, Samsun I9100G] – twinsant

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"/>