안드로이드 개발 질문/답변
(글 수 45,052)
package com.androidhuman.example.CameraPreview.Preview;
import java.io.IOException;
import java.util.List;
import android.app.Activity;
import android.content.Context;
import android.hardware.Camera;
import android.hardware.Camera.CameraInfo;
import android.hardware.Camera.Size;
import android.os.Bundle;
import android.util.AttributeSet;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.ViewGroup;
public class Preview extends ViewGroup implements SurfaceHolder.Callback {
private static final String TAG = "Preview";
SurfaceView mSurfaceView;
SurfaceHolder mHolder;
Size mPreviewSize;
List<Size> mSupportedPreviewSizes;
Camera mCamera;
int camCount;
int currCamIdx = 0;
private void init(Context context)
{
mSurfaceView = new SurfaceView(context);
addView(mSurfaceView);
mHolder = mSurfaceView.getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
camCount = Camera.getNumberOfCameras();
CameraInfo info = new CameraInfo();
for(int i =0; i<camCount; i++)
{
Camera.getCameraInfo(i, info);
if(info.facing == CameraInfo.CAMERA_FACING_BACK)
currCamIdx = i;
}
}
Preview(Context context) {
super(context);
init(context);
// TODO Auto-generated constructor stub
}
public Preview(Context context, AttributeSet attrs, int defStyle)
{
super(context,attrs,defStyle);
init(context);
}
public Preview(Context context, AttributeSet attrs)
{
super(context, attrs);
init(context);
}
public void openCamera()
{
mCamera = Camera.open(currCamIdx);
preparePreviewSize();
}
public void preparePreviewSize()
{
mSupportedPreviewSizes = mCamera.getParameters().getSupportedPreviewSizes();
mPreviewSize = getOptimalPreviewSize(mSupportedPreviewSizes,getResources().getDisplayMetrics().widthPixels
,getResources().getDisplayMetrics().heightPixels);
}
public void switchCamera()
{
releaseCamera();
currCamIdx = (++currCamIdx)%camCount;
setCamera(Camera.open(currCamIdx));
try{
mCamera.setPreviewDisplay(mHolder);
}catch(IOException exception)
{
Log.e(TAG,"IOException caused by setPreviewDisplay()",exception);
}
Camera.Parameters parameters = mCamera.getParameters();
parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height);
mCamera.setParameters(parameters);
mCamera.startPreview();
requestLayout();
}
public void releaseCamera()
{
if(mCamera != null)
{
mCamera.startPreview();
mCamera.release();
mCamera = null;
}
}
public void setCamera(Camera camera)
{
mCamera = camera;
preparePreviewSize();
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
// TODO Auto-generated method stub
if(getChildCount() > 0)
{
final View child = getChildAt(0);
final int width = r- l;
final int height = b - t;
int previewWidth = width;
int previewHeight = height;
if(mPreviewSize != null)
{
previewWidth = mPreviewSize.width;
previewHeight = mPreviewSize.height;
}
if(width * previewHeight > height * previewWidth)
{
final int scaledChildWidth = previewWidth * height / previewHeight;
child.layout((width - scaledChildWidth)/2, 0, (width + scaledChildWidth)/2, height);
}else
{
final int scaledChildHeight = previewHeight * width / previewWidth;
child.layout(0, (height - scaledChildHeight)/2, width, (height + scaledChildHeight));
}
}
}
private Size getOptimalPreviewSize(List<Size> sizes, int w, int h)
{
final double ASPECT_TOLERANCE = 0.1;
double targetRatio = (double)w/h;
if(sizes == null) return null;
Size optimalSize = null;
double minDiff = Double.MAX_VALUE;
int targetHeight = h;
for(Size size : sizes)
{
double ratio = (double)size.width/ size.height;
if(Math.abs(ratio - targetRatio)>ASPECT_TOLERANCE)
continue;
if(Math.abs(size.height - targetHeight)<minDiff)
{
optimalSize = size;
minDiff = Math.abs(size.height - targetHeight);
}
}
if(optimalSize == null)
{
minDiff = Double.MAX_VALUE;
for(Size size : sizes)
{
if(Math.abs(size.height - targetHeight)<minDiff)
{
optimalSize = size;
minDiff = Math.abs(size.height - targetHeight);
}
}
}
return optimalSize;
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
// TODO Auto-generated method stub
if(mCamera != null)
{
Camera.Parameters parameters = mCamera.getParameters();
parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height);
mCamera.setParameters(parameters);
mCamera.startPreview();
}
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
try {
if(mCamera != null)
{
mCamera.setPreviewDisplay(holder);
}
}catch(IOException exception)
{
Log.e(TAG,"IOException caused by setPreviewDisplay()",exception);
mCamera.release();
mCamera = null;
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
if(mCamera != null)
{
mCamera.stopPreview();
}
}
}
이파일이 Preview.java 파일입니다.
기존에 만들어져있는 파일은 CameraPreview.java인데요
메니페스트에서 추가해야하는데 Activity로 인식되지않아 클래스를 선택하지 못합니다.
매니페스트에 어떻게 추가하나요?




clean 한번 해보세요~!!