80,348
社区成员
发帖
与我相关
我的任务
分享
public class MainActivity extends Activity {
//声明拍照界面组件
private SurfaceView surfaceView;
//声明界面控制组件
private SurfaceHolder surfaceHolder;
//声明照相机
private Camera camera;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//获取拍照界面组件
surfaceView = (SurfaceView)findViewById(R.id.preview);
//获取界面控制组件
surfaceHolder = surfaceView.getHolder();
//界面控制组件回调,处理打开相机,关闭相机及照片尺寸改变
Callback surfaceCallback = new Callback() {
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
//停止预览
camera.stopPreview();
//释放相机资源
camera.release();
camera = null;
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
//打开相机
camera = Camera.open();
try{
//设置预览
camera.setPreviewDisplay(holder);
}catch(Exception ex){
ex.printStackTrace();
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
//获得相机参数
Camera.Parameters params = camera.getParameters();
//设置照片大小
params.setPreviewSize(width, height);
//设置照片格式
params.setPictureFormat(PixelFormat.JPEG);
//设置相机参数
camera.setParameters(params);
//开始预览
camera.startPreview();
}
};
//为SurfaceHolder添加回调并设置类型
surfaceHolder.addCallback(surfaceCallback);
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
class SavePictureTask extends AsyncTask<byte [],String,String>{
@Override
protected String doInBackground(byte[]... params) {
// TODO Auto-generated method stub
//创建文件
File picture = new File(Environment.getExternalStorageDirectory(),"picture.jpg");
//如果文件存在就删除掉
if(picture.exists()){
picture.delete();
}
try{
//获得文件输出流
FileOutputStream fos = new FileOutputStream(picture.getPath());
//写入文件
fos.write(params[0]);
//清空并关闭文件流
fos.flush();
fos.close();
}catch(Exception ex){
ex.printStackTrace();
}
return null;
}
}
//照片回调,执行保存照片任务并回到预览界面
Camera.PictureCallback pictureCallback = new PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
// TODO Auto-generated method stub
new SavePictureTask().execute(data);
camera.startPreview();
}
};
//拍照方法
private void takePic(){
//停止预览
camera.stopPreview();
//拍照
camera.takePicture(null, null, pictureCallback);
}
//响应拍照按键事件
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
if(keyCode == KeyEvent.KEYCODE_CAMERA || keyCode == KeyEvent.KEYCODE_SEARCH){
takePic();
return true;
}
return super.onKeyDown(keyCode, event);
}