publicclassCameraActivityextendsActivity{
// private PreView preView = null;
//
// @Override
// protected void onCreate(Bundle savedInstanceState) {
// super.onCreate(savedInstanceState);
// this.requestWindowFeature(Window.FEATURE_NO_TITLE);
// preView = new PreView(this);
// setContentView(preView,new LayoutParams(400, 300));
// }
//
// @Override
// public boolean onKeyDown(int keyCode, KeyEvent event) {
// return preView.onKeyDown(keyCode, event);
// }
privatefinalstaticString TAG ="CameraActivity";
privateSurfaceView surfaceView;
privateSurfaceHolder surfaceHolder;
privateCamera camera;
privateFile picture;
privateButton btnFinish;
privateDialog mDialog;
privateResources res;
@Override
publicvoidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.camera);
setupViews();
}
privatevoidsetupViews(){
surfaceView = (SurfaceView) findViewById(R.id.camera_preview);// 实例化拍照界面组件
surfaceHolder = surfaceView.getHolder();// 实例化拍照界面组件
surfaceHolder.addCallback(surfaceCallback);// 为SurfaceHolder 添加回调
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
res = getResources();
btnFinish =(Button) findViewById(R.id.camera_finish);
btnFinish.setOnClickListener(newOnClickListener() {
//@Override
publicvoidonClick(View v) {
// 提示是否看到预览
if(mDialog ==null){
mDialog =newAlertDialog.Builder(CameraActivity.this).setIcon(
R.drawable.icon).setTitle(res.getString(R.string.camera_title))
.setMessage(res.getString(R.string.camera_msg)).setPositiveButton(
res.getString(R.string.yes), dialogClick)
.setNegativeButton(res.getString(R.string.no), dialogClick).create();
mDialog.show();}
}
});
}
privateandroid.content.DialogInterface.OnClickListener dialogClick =newandroid.content.DialogInterface.OnClickListener() {
// @Override
publicvoidonClick(DialogInterface dialog,intwhich) {
switch(which) {
caseDialogInterface.BUTTON_POSITIVE:
resultRquest(true);
break;
caseDialogInterface.BUTTON_NEGATIVE:
resultRquest(false);
break;
default:
break;
}
}
};
privatevoidresultRquest(booleanflag){
Intent intent =newIntent(CameraActivity.this, MainActivity.class);
intent.putExtra(CAMERA_RESULT, flag);
setResult(REQUESTCODE_CAMERA_RESULT, intent);
finish();
}
@Override
publicbooleanonKeyDown(intkeyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_CAMERA
|| keyCode == KeyEvent.KEYCODE_SEARCH) {
takePic();
returntrue;
}
returnsuper.onKeyDown(keyCode, event);
}
privatevoidtakePic() {
camera.stopPreview();// 停止预览
camera.takePicture(null,null, pictureCallback);// 拍照
}
// 照片回调
Camera.PictureCallback pictureCallback =newCamera.PictureCallback() {
//@Override
publicvoidonPictureTaken(byte[] data, Camera camera) {
newSavePictureTask().execute(data);
camera.startPreview();
}
};
// 保存照片任务类
classSavePictureTaskextendsAsyncTask {
@Override
protectedString doInBackground(byte[]... params) {
picture =newFile(Environment.getExternalStorageDirectory(),
"picture.jpg");// 创建文件
if(picture.exists())
picture.delete();// 如果文件存在删除掉
try{
FileOutputStream fos =newFileOutputStream(picture.getPath());// 获得文件输出流
fos.write(params[0]);// 写到该文件
fos.close();// 关闭文件流
}catch(Exception e) {
e.printStackTrace();
}
returnnull;
}
}
// SurfaceHodler 回调,处理打开相机,关闭相机以及照片尺寸的改变
SurfaceHolder.Callback surfaceCallback =newSurfaceHolder.Callback() {
//@Override
publicvoidsurfaceCreated(SurfaceHolder holder) {
camera = Camera.open();// 打开相机
try{
camera.setPreviewDisplay(holder);// 设置预览
}catch(IOException e) {
camera.release();// 释放
camera =null;
}
}
//@Override
publicvoidsurfaceChanged(SurfaceHolder holder,intformat,intwidth,
intheight) {
Camera.Parameters parameters = camera.getParameters();// 获得相机参数
parameters.setPictureFormat(PixelFormat.JPEG);// 设置照片格式
parameters.setPreviewSize(400,300);// 设置照片大小
camera.setParameters(parameters);// 设置相机参数
camera.startPreview();// 开始预览
}
//@Override
publicvoidsurfaceDestroyed(SurfaceHolder holder) {
Log.i(TAG,"====surfaceDestroyed");
camera.stopPreview();// 停止预览
camera.release();// 释放相机资源
camera =null;
}
};
}
public class CameraActivity extends Activity{
// private PreView preView = null;
//
// @Override
// protected void onCreate(Bundle savedInstanceState) {
// super.onCreate(savedInstanceState);
// this.requestWindowFeature(Window.FEATURE_NO_TITLE);
// preView = new PreView(this);
// setContentView(preView,new LayoutParams(400, 300));
// }
//
// @Override
// public boolean onKeyDown(int keyCode, KeyEvent event) {
// return preView.onKeyDown(keyCode, event);
// }
private final static String TAG = "CameraActivity";
private SurfaceView surfaceView;
private SurfaceHolder surfaceHolder;
private Camera camera;
private File picture;
private Button btnFinish;
private Dialog mDialog;
private Resources res;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.camera);
setupViews();
}
private void setupViews(){
surfaceView = (SurfaceView) findViewById(R.id.camera_preview); // 实例化拍照界面组件
surfaceHolder = surfaceView.getHolder(); // 实例化拍照界面组件
surfaceHolder.addCallback(surfaceCallback); // 为SurfaceHolder 添加回调
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
res = getResources();
btnFinish =(Button) findViewById(R.id.camera_finish);
btnFinish.setOnClickListener(new OnClickListener() {
//@Override
public void onClick(View v) {
// 提示是否看到预览
if(mDialog == null){
mDialog = new AlertDialog.Builder(CameraActivity.this).setIcon(
R.drawable.icon).setTitle(res.getString(R.string.camera_title))
.setMessage(res.getString(R.string.camera_msg)).setPositiveButton(
res.getString(R.string.yes), dialogClick)
.setNegativeButton(res.getString(R.string.no), dialogClick).create();
mDialog.show();}
}
});
}
private android.content.DialogInterface.OnClickListener dialogClick = new android.content.DialogInterface.OnClickListener() {
// @Override
public void onClick(DialogInterface dialog, int which) {
switch (which) {
case DialogInterface.BUTTON_POSITIVE:
resultRquest(true);
break;
case DialogInterface.BUTTON_NEGATIVE:
resultRquest(false);
break;
default:
break;
}
}
};
private void resultRquest(boolean flag){
Intent intent = new Intent(CameraActivity.this, MainActivity.class);
intent.putExtra(CAMERA_RESULT, flag);
setResult(REQUESTCODE_CAMERA_RESULT, intent);
finish();
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_CAMERA
|| keyCode == KeyEvent.KEYCODE_SEARCH) {
takePic();
return true;
}
return super.onKeyDown(keyCode, event);
}
private void takePic() {
camera.stopPreview();// 停止预览
camera.takePicture(null, null, pictureCallback); // 拍照
}
// 照片回调
Camera.PictureCallback pictureCallback = new Camera.PictureCallback() {
//@Override
public void onPictureTaken(byte[] data, Camera camera) {
new SavePictureTask().execute(data);
camera.startPreview();
}
};
// 保存照片任务类
class SavePictureTask extends AsyncTask {
@Override
protected String doInBackground(byte[]... params) {
picture = new File(Environment.getExternalStorageDirectory(),
"picture.jpg");// 创建文件
if (picture.exists())
picture.delete(); // 如果文件存在删除掉
try {
FileOutputStream fos = new FileOutputStream(picture.getPath()); // 获得文件输出流
fos.write(params[0]); // 写到该文件
fos.close(); // 关闭文件流
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
// SurfaceHodler 回调,处理打开相机,关闭相机以及照片尺寸的改变
SurfaceHolder.Callback surfaceCallback = new SurfaceHolder.Callback() {
//@Override
public void surfaceCreated(SurfaceHolder holder) {
camera = Camera.open(); // 打开相机
try {
camera.setPreviewDisplay(holder); // 设置预览
} catch (IOException e) {
camera.release();// 释放
camera = null;
}
}
//@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
Camera.Parameters parameters = camera.getParameters(); // 获得相机参数
parameters.setPictureFormat(PixelFormat.JPEG);// 设置照片格式
parameters.setPreviewSize(400, 300); // 设置照片大小
camera.setParameters(parameters); // 设置相机参数
camera.startPreview(); // 开始预览
}
//@Override
public void surfaceDestroyed(SurfaceHolder holder) {
Log.i(TAG,"====surfaceDestroyed");
camera.stopPreview();// 停止预览
camera.release(); // 释放相机资源
camera = null;
}
};
}
9、按键(只要重写dispoatchKeyEvent即可)