안드로이드 개발 질문/답변
(글 수 45,052)
카메라 사용때문에 찍고 저장하는 간단한 기능을 테스트 삼아 구현해 보려고 합니다.
2. 화면이 90도 돌아서 나옵니다.
이렇습니다. 그런데 당췌 저 "key" 는 어디서 찾을 수 있을까요..?? ㅠ.ㅠ;;
인터넷의 각종소스, API Demo, 레퍼런스 등등을 뒤지면서 방법을 찾고있습니다만 몇가지 문제를 도통 모르겠어서 여쭙니다.
전형적으로 SurfaceView 에 Camera 클래스를 선언해서 찍는걸 구현하고 있습니다만.
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
Camera.Parameters param = camera.getParameters();
param.set("rotation", 90); // <= 에러는 안나지만 안됩니다.
//param.setPreviewSize(w, h); // <= 이게 있으면 에러가 납니다.
param.setPictureSize(w, h); // <= See Also 라더니 마찬가지로 에러가 납니다.
camera.setParameters(param);
camera.startPreview();
}1. 사이즈 조절 불가.
로그켓 내용입니다만... 사이즈가 틀렸다는것 같습니다.
setPreviewSize, setPictureSize 를 주석처리하면 에러 안나고 실행도 됩니다만... 화면이 90도 돌아가서 눌린 상태로 보입니다.
사용법이 틀렸는지 사용하는 장소가 틀렸는지 뭘 더해야하는지 잘 모르겠습니다.
12-29 20:20:44.857: ERROR/QualcommCameraHardware(59): Invalid picture size requested: 320x464
12-29 20:20:44.867: DEBUG/AndroidRuntime(21013): Shutting down VM
12-29 20:20:44.867: WARN/dalvikvm(21013): threadid=1: thread exiting with uncaught exception (group=0x4001d7e0)
12-29 20:20:44.877: ERROR/AndroidRuntime(21013): FATAL EXCEPTION: main
12-29 20:20:44.877: ERROR/AndroidRuntime(21013): java.lang.RuntimeException: setParameters failed
12-29 20:20:44.877: ERROR/AndroidRuntime(21013): at android.hardware.Camera.native_setParameters(Native Method)
12-29 20:20:44.877: ERROR/AndroidRuntime(21013): at android.hardware.Camera.setParameters(Camera.java:647)
12-29 20:20:44.877: ERROR/AndroidRuntime(21013): at com.camera.test005.Preview.surfaceChanged(Preview.java:80)
12-29 20:20:44.877: ERROR/AndroidRuntime(21013): at android.view.SurfaceView.updateWindow(SurfaceView.java:538)
12-29 20:20:44.877: ERROR/AndroidRuntime(21013): at android.view.SurfaceView.dispatchDraw(SurfaceView.java:339)
12-29 20:20:44.877: ERROR/AndroidRuntime(21013): at android.view.ViewGroup.drawChild(ViewGroup.java:1638)
12-29 20:20:44.877: ERROR/AndroidRuntime(21013): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)
12-29 20:20:44.877: ERROR/AndroidRuntime(21013): at android.view.ViewGroup.drawChild(ViewGroup.java:1638)
12-29 20:20:44.877: ERROR/AndroidRuntime(21013): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)
12-29 20:20:44.877: ERROR/AndroidRuntime(21013): at android.view.ViewGroup.drawChild(ViewGroup.java:1638)
12-29 20:20:44.877: ERROR/AndroidRuntime(21013): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)
12-29 20:20:44.877: ERROR/AndroidRuntime(21013): at android.view.ViewGroup.drawChild(ViewGroup.java:1638)
12-29 20:20:44.877: ERROR/AndroidRuntime(21013): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)
12-29 20:20:44.877: ERROR/AndroidRuntime(21013): at android.view.View.draw(View.java:6743)
12-29 20:20:44.877: ERROR/AndroidRuntime(21013): at android.widget.FrameLayout.draw(FrameLayout.java:352)
12-29 20:20:44.877: ERROR/AndroidRuntime(21013): at android.view.ViewGroup.drawChild(ViewGroup.java:1640)
12-29 20:20:44.877: ERROR/AndroidRuntime(21013): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)
12-29 20:20:44.877: ERROR/AndroidRuntime(21013): at android.view.ViewGroup.drawChild(ViewGroup.java:1638)
12-29 20:20:44.877: ERROR/AndroidRuntime(21013): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)
12-29 20:20:44.877: ERROR/AndroidRuntime(21013): at android.view.View.draw(View.java:6743)
12-29 20:20:44.877: ERROR/AndroidRuntime(21013): at android.widget.FrameLayout.draw(FrameLayout.java:352)
12-29 20:20:44.877: ERROR/AndroidRuntime(21013): at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1842)
12-29 20:20:44.877: ERROR/AndroidRuntime(21013): at android.view.ViewRoot.draw(ViewRoot.java:1407)
12-29 20:20:44.877: ERROR/AndroidRuntime(21013): at android.view.ViewRoot.performTraversals(ViewRoot.java:1163)
12-29 20:20:44.877: ERROR/AndroidRuntime(21013): at android.view.ViewRoot.handleMessage(ViewRoot.java:1727)
12-29 20:20:44.877: ERROR/AndroidRuntime(21013): at android.os.Handler.dispatchMessage(Handler.java:99)
12-29 20:20:44.877: ERROR/AndroidRuntime(21013): at android.os.Looper.loop(Looper.java:123)
12-29 20:20:44.877: ERROR/AndroidRuntime(21013): at android.app.ActivityThread.main(ActivityThread.java:4627)
12-29 20:20:44.877: ERROR/AndroidRuntime(21013): at java.lang.reflect.Method.invokeNative(Native Method)
12-29 20:20:44.877: ERROR/AndroidRuntime(21013): at java.lang.reflect.Method.invoke(Method.java:521)
12-29 20:20:44.877: ERROR/AndroidRuntime(21013): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
12-29 20:20:44.877: ERROR/AndroidRuntime(21013): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
12-29 20:20:44.877: ERROR/AndroidRuntime(21013): at dalvik.system.NativeStart.main(Native Method)
12-29 20:20:44.888: WARN/ActivityManager(92): Force finishing activity com.camera.test005/.CameraDemo
portrait 상태로 생각하고 컴파일을 하긴 했습니다만...
.setRotation(90) 못씁니다. 1.6 환경이라서요.
parameter.set("orientation", "portrait") 안됩니다.
parameter.set("rotation", 90) 안됩니다.
현재 사장님의 요구 개발 환경이 1.6 이라서... 안펍과 구글링으로 찾은 많은 함수라든지 방법이 적용할 수가 없더군요.
어떠한 방법으로 화면을 돌릴 수 있는지 모르겠습니다.
3. 레퍼런스
parameter.set 함수의 레퍼런스를 살펴보면...
public void set (String key, String value)
"ratation" 이라는 key 가 맞는지 아닌지도 모르겠습니다.
parameter.set("aaa", 90) 이렇게 해도 에러 안나고 잘 컴파일 되고 실행되더군요.
이부분이 아예 적용자체가 안되는것 같긴 한데 그건 둘째치고 이게 맞는지 아닌지 뭐가 있는지 조차도 모르겠습니다.
소스 첨부합니다.
휴.. 모르는것도 모르는것이지만 뭘 찾아봐야 할지도 모르겠을땐 정말 답답합니다.
모쪼록... 힌트, 힌트가 있는곳, 검색해야할 키워드 뭐든지 좋습니다. 조언을 부탁드립니다.
감사합니다.
2010.12.30 09:21:29
카메라는 안드로이드에서 가장 그지(?)같은 부분 중 하나죠.
기기마다 다 특성타고...
Zxing에서 안드로이드용 바코드 스캐너를 만든게 있는데, 그 소스를 참조하시면 도움이 될 듯 합니다.
http://code.google.com/p/zxing/
2011.01.07 13:45:49
키값을 찾는 방법은 Parameters.flatten() 메소드를 사용해 보세요. 사용가능한 파라미터 목록이 출력됩니다.
meter-mode-values=meter-average,meter-center,meter-spot;
meter-mode=meter-center;
이런식으로 몇십줄 나옵니다. 그 중에서 필요하신 키 값을 찾아보세요.
위에처럼 -values 붙은건 사용가능한 값 목록이구요
아래것이 현재 설정된 값입니다.
위 값들을 참고해서 parameter.set("meter-mode","meter-spot"); 이런식으로 사용할 수 있습니다.
meter-mode-values=meter-average,meter-center,meter-spot;
meter-mode=meter-center;
이런식으로 몇십줄 나옵니다. 그 중에서 필요하신 키 값을 찾아보세요.
위에처럼 -values 붙은건 사용가능한 값 목록이구요
아래것이 현재 설정된 값입니다.
위 값들을 참고해서 parameter.set("meter-mode","meter-spot"); 이런식으로 사용할 수 있습니다.



