2011-09-30 4 views
1

내 앱에서 qrcode를 감지하기 위해 zxing 라이브러리를 사용하고 싶었습니다. 하지만 애플 리케이션을 보는 목적을 위해, 나는 사용자 정의 디스플레이 방향을 세로로 변경해야했습니다. 따라서 나는 내 애플 리케이션에 전체 zxing 라이브러리를 통합하고 openDriver() 메서드에 camera.setDisplayOrientation (90)을 추가해야했습니다. 이 작업을 수행 한 후 프로그램이 작동하지만 "런타임 예외 : 카메라 서비스에 연결하지 못했습니다"라는 메시지가 임의로 표시됩니다.런타임 오류 : android에서 카메라 서비스에 연결하지 못했습니다.

public void openDriver(SurfaceHolder holder) throws IOException { 
    if (camera == null) { 
     camera = Camera.open(); 
     camera.setDisplayOrientation(90); 

     if (camera == null) { 
      throw new IOException(); 
     } 
    } 
    camera.setPreviewDisplay(holder); 
    if (!initialized) { 
    initialized = true; 
    configManager.initFromCameraParameters(camera); 
} 
configManager.setDesiredCameraParameters(camera); 

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); 
reverseImage = prefs.getBoolean(PreferencesActivity.KEY_REVERSE_IMAGE, false); 
if (prefs.getBoolean(PreferencesActivity.KEY_FRONT_LIGHT, false)) { 
    FlashlightManager.enableFlashlight(); 
} 
} 

public void closeDriver() { 
    if (camera != null) { 
     FlashlightManager.disableFlashlight(); 
     camera.release(); 
     camera = null; 
     framingRect = null; 
     framingRectInPreview = null; 
    } 
} 

/** 
* Asks the camera hardware to begin drawing preview frames to the screen. 
*/ 
public void startPreview() { 
    if (camera != null && !previewing) { 
     camera.startPreview(); 
     previewing = true; 
    } 
} 

/** 
* Tells the camera to stop drawing preview frames. 
*/ 
public void stopPreview() { 
    if (camera != null && previewing) { 
     if (!useOneShotPreviewCallback) { 
      camera.setPreviewCallback(null); 
     } 
     camera.stopPreview(); 
     previewCallback.setHandler(null, 0); 
     autoFocusCallback.setHandler(null, 0); 
     previewing = false; 
    } 
}  

답변

1

오리 엔테이션 변화가 그 원인인지 의심 스럽습니다. 활동이 멈출 때마다 오류가 발생하지만 onPause에서 Camera.release를 호출하지 못하는 것으로 나타났습니다. 그 결과, 다음 번에 Camera.open을 시도 할 때 드라이버가 사라 졌음을 알리는 응용 프로그램/활동에 관계없이 드라이버가 여전히 열린 것으로 간주하므로 런타임 오류가 발생합니다.

예외를 throw하고 활동을 중단시킬 때 디버깅/테스트 중에 쉽게이 문제가 발생할 수 있습니다. 모든 예외를 포착하고 활동을 끝내기 전에 반드시 카메라를 놓아야합니다.

그런데 카메라를 다시 열려면 기기의 전원을 껐다가 다시 켜야합니까?

+0

답장을 보내 주셔서 감사합니다. 예, 다시 작동하려면 장치를 다시 시작해야합니다. 문제가 계속 발생하면 항상 앱을 종료하고 다시 실행하십시오. 그러나 이것은 매우 무작위로 발생합니다. onPause() 및 onDestroy()에서 카메라를 릴리스하고 있습니다. – bpn

+0

때때로 앱이 때때로 충돌을 일으킨 다음 onPause 또는 onDestroy로 연결되지 않는 것이 확실합니까? onDestory는 호출 할 수 없으며 onPause가 해당 활동에서 캐치되지 않은 예외가 발생하는 경우 건너 뛸 수 있습니다. 어쩌면 일부 로깅을 수행하고 런타임 예외 이전에 정상적으로 종료 된 응용 프로그램을 확인하기 위해 logcat을 사용할 수 있습니까? – mmeyer

+0

네, 저도 해왔습니다. 주요 문제는이 상황이 무작위로 발생하므로 상황을 재현 할 수 없다는 것입니다. 어떤 경우에는 카메라가 출시되는 데 더 오랜 시간이 걸릴 수 있으며 따라서 프로그램이 실행될 때 리소스가 완전히 해제되지 않을 수 있습니까? – bpn

관련 문제