안드로이드 개발 질문/답변
(글 수 45,052)
접근허가줬어요!
AndroidManifest.xml 파일에 <uses-permission android:name="android.permission.CAMERA"/> 썼구요
하루종일 관련소스들 붙잡고 보고있는데 어렵네요
CameraDemo.java 는 프레임에 카메라를 뿌려주고, 화면을 터치하면 캡쳐화면을 따오는거까지 하려고 하는데
CameraTemplate.java 는 카메라 생성과 변경,소멸에 관한 내용을 책에서 본대로 쓰긴했는데;
캡쳐는 둘째 치고 우선 구동부터 시켜보고싶어요 ㅠㅠㅠ
package test03.yoon.TestingMix; import java.util.List; import android.content.Context; import android.graphics.PixelFormat; import android.hardware.Camera; import android.hardware.Camera.Size; import android.util.Log; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.widget.Toast;
public class CameraTemplate extends SurfaceView implements SurfaceHolder.Callback { private final String TAG = "Template"; private SurfaceHolder holder; private SurfaceView surfaceView; private Camera camera;
public CameraTemplate(Context context) { super(context); holder = getHolder(); holder.addCallback(this); holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); }
public void surfaceCreated(SurfaceHolder holder) { camera = Camera.open(); try { camera.setPreviewDisplay(holder); } catch (Throwable t) { Log.e("CameraDemo-surfaceCallback","Exception in setPreviewDisplay()", t); //Toast.makeText(CameraTemplate.this, t.getMessage(), Toast.LENGTH_LONG).show(); } } public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { Camera.Parameters parameters = camera.getParameters(); parameters.setPreviewSize(width, height); parameters.setPictureFormat(PixelFormat.JPEG); camera.setParameters(parameters); camera.startPreview(); } public void surfaceDestroyed(SurfaceHolder holder) { camera.stopPreview(); camera.release(); camera = null ;
} //캡쳐....코딩...아직덜했구요ㅠㅠ 모르겠어요암튼 public boolean Capture(Camera.PictureCallback jpegHandler) { if (camera != null){ camera.takePicture(null, null, jpegHandler); return true; }else { return false; } }
}
이거는 CameraDemo.java 파일이요
package test03.yoon.TestingMix; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import android.app.Activity; import android.hardware.Camera; import android.hardware.Camera.PictureCallback; import android.os.Bundle; import android.util.Log; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.widget.FrameLayout; import android.widget.Toast;
public class CameraDemo extends Activity { protected static final String TAG = null; Toast yToast =null; private CameraTemplate CamarePreview; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); FrameLayout frame = (FrameLayout) findViewById(R.id.frame); CamarePreview = new CameraTemplate(this); frame.addView(CamarePreview); frame.setOnTouchListener(frameTouchLister); } View.OnTouchListener frameTouchLister = new OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { if(event.getAction() == MotionEvent.ACTION_DOWN){ //카메라 캡쳐를 넣으면 되 ㅋㅋㅋㅋㅋㅋ여기서 터치발생할경우! return true; } return false; } }; }
2011.01.03 22:07:02
넥서스원은 카메라 구동이 약간 다르답니다.
파라메터을 지우거나 바꾸거나 이것저것 해 보세요. ^^카메라해상도, 화면해상도, 사진해상도가 기기별로 달라서 발생하는 문제인데
전 전세계 80종 스마트폰 카메라오류 해결하는데 두달 걸렸네요.
2011.01.03 23:33:51
방금 확인해보니 parameters.setPreviewSize(width, height); 이 부분이 문제입니다.
surfaceChanged 메소드에서 인자로 받은 (width, height) 는 (320, 483) 인데,
실제 parameters.getPreviewSize() 로 확인해 보면 (640, 480) 이 나오거든요.
픽셀포멧은 JPEG 이 맞는 듯 하네요.
2011.01.04 00:14:57
매발톱님이 비슷하게 접근하셨네요. ^^
파라메터로 넘어오는 값, 실제 값, 카메라뷰로 사용가능한 값, 이미지값 이 모두 다른 경우도 있답니다.
Camera.getParameters().getPreviewSize().width 요런것도 한번 사용해 보세요.
2011.01.05 00:24:56
음.. 찾아보니까 방법이 있네요!
첫번째 방법은 하나의 모드로 고정하는 방법인데 다음 링크를 참고하세요.
두번째 방법은 다음 링크를 참고하세요.
먼저 안드로이드 API가 버전 8이상이라는 가정하에, 다음 코드를 camera.startPreview() 앞에 추가하면 됩니다.
(단, 여기서 view 를 생성할 때 activity 객체를 받아와야 합니다)
int rotation = activity.getWindowManager().getDefaultDisplay().getRotation();
int degrees = 0;
switch (rotation) {
case Surface.ROTATION_0: degrees = 0; break;
case Surface.ROTATION_90: degrees = 90; break;
case Surface.ROTATION_180: degrees = 180; break;
case Surface.ROTATION_270: degrees = 270; break;
}
int result = (90 - degrees + 360) % 360;
camera.setDisplayOrientation(result);