2014-01-14 3 views
0

Я тестирую приложение Android на samsung gt i8260, samsung s4 и sony ericsson xperia mini st15i.camera.cancelAutoFocus не вернется или не выбрасывает исключение

Приложение в какой-то момент кода во время предварительного просмотра и автофокусировки постоянно (обратный вызов вызывает камеру.autoFocus снова каждый раз) вызывает camera.cancelAutoFocus(), затем задает некоторые параметры фонарика (чтобы запустить или остановить факел режим) и, наконец, вызов камеры.autoFocus.

Оба S4 и Xperia работают нормально. Но gt перестает отвечать после вызова camera.cancelAutoFocus, который не возвращает и не генерирует исключение. Он просто висит.

Документация cancelAutoFocus:

Cancels any auto-focus function in progress. Whether or not auto-focus is currently in progress, this function will return the focus position to the default. If the camera does not support auto-focus, this is a no-op. 

не объясняет такое поведение.

Снятие cancelAutoFocus работает для S4 и GT, но не для Xperia, который генерирует исключение на setParameters.

Неужели кто-нибудь сталкивается с такой же проблемой или с аналогичной проблемой? Как я могу решить эту проблему? Является ли это спецификацией оборудования или ошибкой?

ответ

0

Хотя это не объясняет, что ваше приложение зависает, вам следует рассмотреть возможность использования непрерывного фокуса, то есть Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE или FOCUS_MODE_CONTINUOUS_VIDEO.

http://developer.android.com/reference/android/hardware/Camera.Parameters.html#FOCUS_MODE_CONTINUOUS_PICTURE

Убедитесь, чтобы проверить, если его поддерживается аппаратными средствами первой с getSupportedFocusModes().

Это даст вам плавный и непрерывный фокус.

+0

Я использовал FOCUS_MODE_CONTINUOUS_VIDEO, которые делают не дают желаемого результата. CONTINUOUS_PICTURE не может использоваться из-за ограничения версии API (9) – Blim

0

Это, как я делаю, и его работать на всех устройствах

  1. Я начинаю автофокусировку в surfaceChanged
  2. Start Flash Light при необходимости
  3. Удаление в методе surfaceDestroyed

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) 
{ 
    if(mCamera==null) 
     return; 

    Camera.Parameters parameters = null; 
    parameters = mCamera.getParameters(); 
    if (Holder.getSurface() == null) 
    { // preview surface does not exist 
     //mCamera = null; 
     return; 
    } 

    // Stopping the camera preview so as to set the new params 
    try 
    { 
     mCamera.stopPreview();// why the application is crashing here 
    } 
    catch(Exception e) 
    { 
     e.printStackTrace(); 
    } 

    try 
    { 
     mCamera.setParameters(parameters); 
     mCamera.startPreview(); 

     //Check Whether device supports AutoFlsh, If you YES then Enable AutoFlash 
     if (parameters.getSupportedFlashModes().contains(android.hardware.Camera.Parameters.FLASH_MODE_AUTO)) 
     { 
      parameters.setFlashMode(Parameters.FLASH_MODE_AUTO); 
     } 

     if (parameters.getSupportedFocusModes().contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)) { 
      parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);//FOCUS_MODE_CONTINUOUS_VIDEO 
     } 
     else if (parameters.getSupportedFocusModes().contains(android.hardware.Camera.Parameters.FOCUS_MODE_AUTO)) 
     { 
      mCamera.autoFocus(myAutoFocusCallback); 
      //parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO); 
     } 
    } 
    catch(Exception e1) 
    { 
     e1.printStackTrace(); 
    } 
} 


public void surfaceDestroyed(SurfaceHolder holder) 
{ 
    try 
    { 
     mCamera.cancelAutoFocus(); 
     mCamera.stopPreview();  
     mCamera.release(); 
     mCamera = null; 
    } 
    catch(Exception e) 
    { 
     e.printStackTrace(); 
    } 
} 

// --------------- AutoFocusCallback methods implementations ----------// 
AutoFocusCallback myAutoFocusCallback = new AutoFocusCallback() 
{ 
    @Override 
    public void onAutoFocus(boolean arg0, Camera arg1) 
    {     
     isAutofoucsed =true; 
    } 
}; 
+0

Дело в том, что я хочу включить факел во время предварительного просмотра камеры. Насколько я знаю в некоторых устройствах (xperia mini), если вы пытаетесь установить параметры для использования факела во время автофокусировки камеры, произойдет сбой приложения. Поэтому я пытаюсь отменить автофокус в случайное время при автофокусировке. На моих устройствах samsung, не вызывающих cancelAutofocus устройства, не влияет на настройку параметров ... – Blim

+0

@Blim Пожалуйста, проверьте сейчас, я добавил Flash-свет, кстати, с этим сокращением кода. У меня есть автофокус и при перемещении камеры в темный объект, который он запускает вспышка во время предварительного просмотра. дайте мне знать, что у вас есть проблемы в этом. – swiftBoy