|
Android应用提供了Camera来控制拍照,使用Camera进行拍照的步骤: 1、调用Camera的open()方法打开相机。
2、调用Camera的getParameters()方法获取拍照参数,该方法返回一个Camera.Parameters对象。
3、调用Camera.Parameters对象方法设置拍照参数。
4、调用Camera的setParameter(),将Camera.Parameters对象作为参数传入,既可对相机的拍照参数进行控制,注:Android2.2.3以后不需要这步。
5、调用Camera的startPreview()方法开始预览取景,在预览取景之前需调用Camera的setPreviewDisplay(SurfaceHolderholder)方法设置使用哪个SurfaceView来显示取景图片。
6、调用Camera的takePicture()方法进行拍照。
7、结束程序时,调用Camera的stopPreview()结束取景预览,并调用release()方法释放资源。
下面直接上代码:
public class CaptureImage extends Activity
{
SurfaceView sView;
SurfaceHolder surfaceHolder;
int screenWidth, screenHeight;
// 定义系统所用的照相机
Camera camera;
//是否在浏览中
boolean isPreview = false;
@Override
public void onCreate(BundlesavedInstanceState)
{
super.onCreate(savedInstanceState);
// 设置全屏
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.main);
WindowManager wm =(WindowManager) getSystemService(
Context.WINDOW_SERVICE);
Display display =wm.getDefaultDisplay();
// 获取屏幕的宽和高
screenWidth =display.getWidth();
screenHeight =display.getHeight();
// 获取界面中SurfaceView组件
sView = (SurfaceView)findViewById(R.id.sView);
//获得SurfaceView的SurfaceHolder
surfaceHolder =sView.getHolder();
//为surfaceHolder添加一个回调监听器
surfaceHolder.addCallback(newCallback()
{
@Override
public voidsurfaceChanged(SurfaceHolder holder, int format, int width,
intheight)
{
}
@Override
public voidsurfaceCreated(SurfaceHolder holder)
{
//打开摄像头
initCamera();
}
@Override
public voidsurfaceDestroyed(SurfaceHolder holder)
{
//如果camera不为null ,释放摄像头
if(camera != null)
{
if(isPreview)
camera.stopPreview();
camera.release();
camera= null;
}
}
});
//设置该SurfaceView自己不维护缓冲
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
private void initCamera()
{
if (!isPreview)
{
camera =Camera.open();
}
if (camera != null &&!isPreview)
{
try
{
Camera.Parametersparameters = camera.getParameters();
//设置预览照片的大小
parameters.setPreviewSize(screenWidth,screenHeight);
//每秒显示4帧
parameters.setPreviewFrameRate(4);
//设置图片格式
parameters.setPictureFormat(PixelFormat.JPEG);
//设置JPG照片的质量
parameters.set("jpeg-quality",85);
//设置照片的大小
parameters.setPictureSize(screenWidth,screenHeight);
camera.setParameters(parameters);
//通过SurfaceView显示取景画面
camera.setPreviewDisplay(surfaceHolder);
//开始预览
camera.startPreview();
//自动对焦
camera.autoFocus(null);
}
catch(Exception e)
{
e.printStackTrace();
}
isPreview =true;
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEventevent)
{
switch (keyCode)
{
//当用户单击照相键、中央键时执行拍照
caseKeyEvent.KEYCODE_DPAD_CENTER:
caseKeyEvent.KEYCODE_CAMERA:
if(camera != null && event.getRepeatCount() == 0)
{
//拍照
camera.takePicture(null,null , myjpegCallback);
returntrue;
}
break;
}
return super.onKeyDown(keyCode,event);
}
PictureCallback myjpegCallback = newPictureCallback()
{
@Override
public voidonPictureTaken(byte[] data, Camera camera)
{
//根据拍照所得的数据创建位图
final Bitmapbm = BitmapFactory.decodeByteArray(data
,0, data.length);
//加载/layout/save.xml文件对应的布局资源
ViewsaveDialog = getLayoutInflater().inflate(
R.layout.save,null);
finalEditText photoName = (EditText) saveDialog
.findViewById(R.id.phone_name);
//获取saveDialog对话框上的ImageView组件
ImageViewshow = (ImageView) saveDialog.findViewById(R.id.show);
//显示刚刚拍得的照片
show.setImageBitmap(bm);
//使用对话框显示saveDialog组件
newAlertDialog.Builder(CaptureImage.this)
.setView(saveDialog)
.setPositiveButton("保存",new OnClickListener()
{
@Override
publicvoid onClick(DialogInterface dialog,
intwhich)
{
//创建一个位于SD卡上的文件
Filefile = new File(Environment.getExternalStorageDirectory()
, photoName.getText().toString() + ".jpg");
FileOutputStreamoutStream = null;
try
{
//打开指定文件对应的输出流
outStream= new FileOutputStream(file);
//把位图输出到指定文件中
bm.compress(CompressFormat.JPEG,100, outStream);
outStream.close();
}
catch(IOException e)
{
e.printStackTrace();
}
}
})
.setNegativeButton("取消",null)
.show();
//重新浏览
camera.stopPreview();
camera.startPreview();
isPreview =true;
}
};
}
|
|