안드로이드 개발 질문/답변
(글 수 45,052)
카메라에 대해 공부중인데 해답을 찾지 못해 질문 드려요.
프리뷰 화면이 의도한 대로 나오지 않고 좌측으로 90도 돌려진 상태로 나옵니다.
화면도 세로 방향이 늘어져서 길게 나와요. 폰을 눕힐 경우 화면이 깨지거나 아예 작동을 하지 않습니다.
인테넷에 있는 간단한 예제 소스로 시험 중인데, 어느 소스를 받아도 내용은 비슷하며 같은 결과가 나옵니다.
얕은 지식으로 이것저것 해결을 시도해 보았는데요,
카메라 파라메터에 .SetRotation(90); 을 시켜 보았는데 화면의 방향은 정상이 되지만 가로줄이 생기면서 깨지고요.
액티비티의 screen orientation을 landscape로 설정하여 해결한 소스를 보았는데 의도치 않게 SurfaceView뿐만 아니라 액티비티 전체가 돌아가며 여전히 화면의 늘어짐 문제는 해결되지 않았습니다.
오버라이드된 surfaceChanged 함수의 width, height인자의 넘어온 값을 찍어보면 화면 해상도와는 딴판의 값이 넘어옵니다(더 작은, 원래 이런지는 잘 모르겠습니다).
갤럭시S, android 2.1로 시험 중이며, 다른 글을 검색해 보니 이러한 현상에 관한 글이 거의 없으며 디자이어에서 이런 현상에 대한 글이 있었습니다. 제가 잘못하는건지 일부에서만 이런 현상이 있는건지 감이 잘 안잡히네요.
로그를 보면 실행 초기의 에러 메세지는 아래와 같이 나오는데 이상이 있는건지 무시할만한 것인지 잘 모르겠습니다.
07-04 12:23:45.511: ERROR/SecCamera(2163): SetRotate(angle(0))
07-04 12:23:45.511: ERROR/SecCamera(2163): setRecordingSize(width(320), height(508))
07-04 12:23:45.511: ERROR/SecCamera(2163): stopPreview()
07-04 12:23:45.511: ERROR/SecCamera(2163): stopPreview: m_flag_camera_start is zero
07-04 12:23:45.511: ERROR/SecCamera(2163): startPreview()m_preview_width: 320 m_preview_height: 508 m_angle: 0
07-04 12:23:46.586: ERROR/SecCamera(2163): get_firmware_data: FW Version: 5.15, PRM Version: 7.55
07-04 12:23:46.586: ERROR/SecCamera(2163): SecCamera::get_firmware_data RELEASED Year : 2010
07-04 12:23:46.586: ERROR/SecCamera(2163): SecCamera::get_firmware_data RELEASED Month: 5
07-04 12:23:46.586: ERROR/SecCamera(2163): SecCamera::get_firmware_data RELEASED Date : 27
07-04 12:23:46.586: ERROR/SecCamera(2163): SecCamera::get_firmware_data Year : 2010
07-04 12:23:46.586: ERROR/SecCamera(2163): SecCamera::get_firmware_data Month: 5
07-04 12:23:46.586: ERROR/SecCamera(2163): SecCamera::get_firmware_data Date : 27
07-04 12:23:46.636: ERROR/SecCamera(2163): startPreview: get the first frame of the preview
07-04 12:23:46.636: ERROR/CameraHardwareSec(2163): startPreview : return startPreview 0
07-04 12:23:46.636: ERROR/CameraHardwareSec(2163): CameraHardwareSec: mPostViewWidth = 640 mPostViewHeight = 480 mPostViewSize = 614400
07-04 12:23:46.636: ERROR/CameraHardwareSec(2163): CameraHardwareSec: mRawHeap : MemoryHeapBase(previewHeapSize(614408))
07-04 12:23:46.656: ERROR/Camera(3656): Error 0
폰을 눕힐시 아예 작동을 하지 않으며 아래의 에러 메세지가 무한 반복됩니다.
07-04 12:23:45.101: ERROR/copybit(2230): Error in VIDIOC_STREAMON
07-04 12:23:45.101: ERROR/copybit(2230): Fail : v4l2_stream_on()
07-04 12:23:45.106: ERROR/copybit(2230): stretch_copybit::sec_stretch fail : ret=-5
혹시나 하는 생각에 소스 첨부할께요. 간단한 예제소스 같지만... 조언 부탁드려요.
프리뷰 화면이 의도한 대로 나오지 않고 좌측으로 90도 돌려진 상태로 나옵니다.
화면도 세로 방향이 늘어져서 길게 나와요. 폰을 눕힐 경우 화면이 깨지거나 아예 작동을 하지 않습니다.
인테넷에 있는 간단한 예제 소스로 시험 중인데, 어느 소스를 받아도 내용은 비슷하며 같은 결과가 나옵니다.
얕은 지식으로 이것저것 해결을 시도해 보았는데요,
카메라 파라메터에 .SetRotation(90); 을 시켜 보았는데 화면의 방향은 정상이 되지만 가로줄이 생기면서 깨지고요.
액티비티의 screen orientation을 landscape로 설정하여 해결한 소스를 보았는데 의도치 않게 SurfaceView뿐만 아니라 액티비티 전체가 돌아가며 여전히 화면의 늘어짐 문제는 해결되지 않았습니다.
오버라이드된 surfaceChanged 함수의 width, height인자의 넘어온 값을 찍어보면 화면 해상도와는 딴판의 값이 넘어옵니다(더 작은, 원래 이런지는 잘 모르겠습니다).
갤럭시S, android 2.1로 시험 중이며, 다른 글을 검색해 보니 이러한 현상에 관한 글이 거의 없으며 디자이어에서 이런 현상에 대한 글이 있었습니다. 제가 잘못하는건지 일부에서만 이런 현상이 있는건지 감이 잘 안잡히네요.
로그를 보면 실행 초기의 에러 메세지는 아래와 같이 나오는데 이상이 있는건지 무시할만한 것인지 잘 모르겠습니다.
07-04 12:23:45.511: ERROR/SecCamera(2163): SetRotate(angle(0))
07-04 12:23:45.511: ERROR/SecCamera(2163): setRecordingSize(width(320), height(508))
07-04 12:23:45.511: ERROR/SecCamera(2163): stopPreview()
07-04 12:23:45.511: ERROR/SecCamera(2163): stopPreview: m_flag_camera_start is zero
07-04 12:23:45.511: ERROR/SecCamera(2163): startPreview()m_preview_width: 320 m_preview_height: 508 m_angle: 0
07-04 12:23:46.586: ERROR/SecCamera(2163): get_firmware_data: FW Version: 5.15, PRM Version: 7.55
07-04 12:23:46.586: ERROR/SecCamera(2163): SecCamera::get_firmware_data RELEASED Year : 2010
07-04 12:23:46.586: ERROR/SecCamera(2163): SecCamera::get_firmware_data RELEASED Month: 5
07-04 12:23:46.586: ERROR/SecCamera(2163): SecCamera::get_firmware_data RELEASED Date : 27
07-04 12:23:46.586: ERROR/SecCamera(2163): SecCamera::get_firmware_data Year : 2010
07-04 12:23:46.586: ERROR/SecCamera(2163): SecCamera::get_firmware_data Month: 5
07-04 12:23:46.586: ERROR/SecCamera(2163): SecCamera::get_firmware_data Date : 27
07-04 12:23:46.636: ERROR/SecCamera(2163): startPreview: get the first frame of the preview
07-04 12:23:46.636: ERROR/CameraHardwareSec(2163): startPreview : return startPreview 0
07-04 12:23:46.636: ERROR/CameraHardwareSec(2163): CameraHardwareSec: mPostViewWidth = 640 mPostViewHeight = 480 mPostViewSize = 614400
07-04 12:23:46.636: ERROR/CameraHardwareSec(2163): CameraHardwareSec: mRawHeap : MemoryHeapBase(previewHeapSize(614408))
07-04 12:23:46.656: ERROR/Camera(3656): Error 0
폰을 눕힐시 아예 작동을 하지 않으며 아래의 에러 메세지가 무한 반복됩니다.
07-04 12:23:45.101: ERROR/copybit(2230): Error in VIDIOC_STREAMON
07-04 12:23:45.101: ERROR/copybit(2230): Fail : v4l2_stream_on()
07-04 12:23:45.106: ERROR/copybit(2230): stretch_copybit::sec_stretch fail : ret=-5
혹시나 하는 생각에 소스 첨부할께요. 간단한 예제소스 같지만... 조언 부탁드려요.
public class CameraTest extends Activity implements SurfaceHolder.Callback {
Camera mCamera;
/** Called when the activity is first created. */
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.main);
SurfaceView sv = (SurfaceView)findViewById(R.id.test);
SurfaceHolder sh = sv.getHolder();
sh.addCallback(this);
sh.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
Camera.Parameters parameters = mCamera.getParameters();
parameters.setPreviewSize(width, height);
mCamera.setParameters(parameters);
mCamera.startPreview();
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
mCamera = Camera.open();
try {
mCamera.setPreviewDisplay(holder);
} catch (IOException exception) {
mCamera.release();
mCamera = null;
// TODO: add more exception handling logic here
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
mCamera.stopPreview();
mCamera.release();
mCamera = null;
}
}
2010.07.04 15:06:15
와! 정말 많은 도움이 되었습니다. portrait 상태의 해결책은 아직 미지수이지만 의심스러웠던 부분이 말끔히 해소 되었어요!
저 역시 landscape 상태에서만 정상 작동하고 Portrait 상태를 지원하지 않는건가 하는 추측이 드네요ㅎㅎ 해결책 아시는분 공유 해주심 고맙겠고요... 조언 정말 감사합니다^^
2010.07.04 16:45:33
감사하다고 말씀해주시니 제가 다 몸둘 바를 모르겠네요 ^^;; 걍 제가 삽질하면서 알게 된 내용인지라 틀릴 수 도 있답니다 :)
그리고 얼마 전 갤럭시 S의 펌 웨어 업데이트가 있어서 그걸 적용하여 카메라 프리뷰를 뿌려봤지만, 이 문제는 해결되지 않았네요.
로그를 찍어보니 아래처럼 lcmcoals님의 로그 메시지와 동일한 펌웨어 버전이 나오더라구요.
07-04 16:39:41.589: ERROR/SecCamera(2161): get_firmware_data: FW Version: 5.15, PRM Version: 7.55
이 문제가 일반 개발자가 접근할 수 없는 상황(하드웨어 문제나 플랫폼 포팅 문제)이라 차후 펌웨어에서 수정 될테지만, 현재 상황으로는 가로(landscape) 모드를 이용하여 우회해 구현하는 방법 말고는 해결책이 없는 상황이라 난감하네요 ^^;;
그럼 수고하세요!! 즐거운 주말 되시길!!
그리고 얼마 전 갤럭시 S의 펌 웨어 업데이트가 있어서 그걸 적용하여 카메라 프리뷰를 뿌려봤지만, 이 문제는 해결되지 않았네요.
로그를 찍어보니 아래처럼 lcmcoals님의 로그 메시지와 동일한 펌웨어 버전이 나오더라구요.
07-04 16:39:41.589: ERROR/SecCamera(2161): get_firmware_data: FW Version: 5.15, PRM Version: 7.55
이 문제가 일반 개발자가 접근할 수 없는 상황(하드웨어 문제나 플랫폼 포팅 문제)이라 차후 펌웨어에서 수정 될테지만, 현재 상황으로는 가로(landscape) 모드를 이용하여 우회해 구현하는 방법 말고는 해결책이 없는 상황이라 난감하네요 ^^;;
그럼 수고하세요!! 즐거운 주말 되시길!!




저도 많은 테스트를 해봤지만 현재 갤럭시 S에서는 카메라 프리뷰가 portrait 상태로는 정상 작동을 하지 않는 것 같습니다.
이건 단순히 제 추측입니다 ^^;; 그리고 말씀하신 실행 초기 에러 메시지는 갤럭시 S의 카메라를 구동시킬 때 카메라 상태를 뿌려주는 것으로 알고 있습니다. 저걸 왜 Error 로그로 남겼는지는 미지수이지만요 -ㅁ-;; 그리고 surfaceChanged()에서 넘어온 인자(높이, 넓이)를 그대로 Parameters에 셋팅하지 마시고 자신이 원하는 사이즈로 셋팅해주면 됩니다 :3
갤럭시S의 카메라 어플들 중 기본으로 들어가 있는 카메라 어플로 가로 모드이고 세로 모드로 동작하는 어플들을 뜯어보니 가로로 동작하면서 그 위에 UI만 세로인척 덮어놨더군요 ^^;;
Layout(SurfaceView)과 카메라 프리뷰의 파라메터를 모두 landscape 상태로 프리뷰를 실행하면 가로 상태로는 정상 작동하지만,
둘다 Portrait 상태가 되면 프리뷰 화면의 절반이 날라가고, 카메라 파라메터만 portrait 상태로 설정하면 화면이 깨지고, 레이아웃만 portrait로 설정하면 카메라 영상이 90도 돌아간 채로 화면에 뿌려지는 이상 현상이 발생합니다.
이 문제로 해외 및 국내의 안드로이드 개발 커뮤니티를 뒤져봤지만 아직까지 해결 방법이 보이지 않네요.
혹여 해결방법을 아시는 분은 공유해주시면 감사하겠습니다!!!