相机Camera
public class Main extends Activity implements SurfaceHolder.Callback,OnClickListener, PictureCallback {private Camera camera;// 相机private boolean isboolean = true;public static final int ITEM0 = Menu.FIRST;public static final int ITEM1 = Menu.FIRST + 1;public static final int ITEM2 = Menu.FIRST + 2;byte[] data;SurfaceView surfaceView;ImageButton take_btn;// 拍照ImageButton tool_btn;// 工具public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);getWindow().setFormat(PixelFormat.TRANSLUCENT);//requestWindowFeature(Window.FEATURE_NO_TITLE);getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);setContentView(R.layout.main);getView();// 实例化surfaceView.getHolder().setFixedSize(320, 240); // 设置分辨率surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);surfaceView.getHolder().addCallback(this);// 回调}public void getView() {surfaceView = (SurfaceView) findViewById(R.id.surface_camera);take_btn = (ImageButton) findViewById(R.id.shutter);tool_btn = (ImageButton) findViewById(R.id.finish);take_btn.setOnClickListener(this);tool_btn.setOnClickListener(this);}public void onClick(View v) {switch (v.getId()) {case R.id.shutter:// 拍照camera.takePicture(null, null, this);break;case R.id.finish:// 工具Main.super.openOptionsMenu();// 打开菜单break;default:break;}}public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {// 在界面尺寸改变时被调用,设置相机的参数(大小,格式)if (isboolean) {camera.stopPreview();}// 相机参数设置Camera.Parameters para = camera.getParameters();para.setPictureFormat(PixelFormat.JPEG);para.setPreviewSize(w, h);para.setPictureSize(640, 480);// 照片大小para.set("rotation", 90);camera.setParameters(para);try {camera.setPreviewDisplay(holder);} catch (IOException e) {e.printStackTrace();}camera.startPreview();isboolean = true;}public void surfaceCreated(SurfaceHolder holder) {// 界面创建时被调用,一般是用来,打开相机,设置预览camera = Camera.open();// 不能放在构造函数里,否则产生不了预览效果}public void surfaceDestroyed(SurfaceHolder holder) {camera.stopPreview();isboolean = false;camera.release();}private Dialog buildDialog(Context context) {AlertDialog.Builder builder = new AlertDialog.Builder(context);builder.setTitle("是否储存照片");builder.setPositiveButton("存储", new DialogInterface.OnClickListener() {public void onClick(DialogInterface arg0, int arg1) {savepicture(data);}});builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog, int which) {camera.startPreview();}});return builder.create();};public Dialog onCreateDialog(int i) {switch (i) {case 1:return buildDialog(Main.this);}return null;};@SuppressWarnings("static-access")public void savepicture(byte[] _data) {String string = null;// 获取系统时间,并格式化Calendar calendar = Calendar.getInstance();calendar.setTime(new Date());int year = calendar.get(Calendar.YEAR);int mounth = calendar.get(Calendar.MONTH) + 1;int day = calendar.get(Calendar.DATE);int hour = calendar.get(calendar.HOUR);int min = calendar.get(calendar.MINUTE);int secound = calendar.get(calendar.SECOND);// 格式一:2011-11-1 12-12-66 作为文件名String formateDate1 = String.valueOf(year) + "-"+ String.valueOf(mounth) + "-" + String.valueOf(day) + " "+ String.valueOf(hour) + "-" + String.valueOf(min) + "-"+ String.valueOf(secound);// 格式二:2011年11月1日 12时12分45秒 写在照片上String formateDate2 = String.valueOf(year) + "年"+ String.valueOf(mounth) + "月" + String.valueOf(day) + "日 "+ String.valueOf(hour) + "时" + String.valueOf(min) + "分"+ String.valueOf(secound) + "秒";// SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HHmmss");// String date = sdf.format(new Date());try {Bitmap bitmap = BitmapFactory.decodeByteArray(_data, 0,_data.length);Bitmap newbitmap = dateBitmap(bitmap, formateDate2);String photoName = formateDate1 + ".jpg";// 照片名称string = photoName;File file = new File(Utils.getSDPath(), photoName);// 创建图片文件FileOutputStream outStream = new FileOutputStream(file);newbitmap.compress(CompressFormat.JPEG, 100, outStream);outStream.close();camera.stopPreview();camera.startPreview();// 开始预览} catch (Exception e) {}Toast.makeText(Main.this, "照片存储路径:" + Utils.getSDPath() + "/" + string,2000).show();}// 往照片上写入日期private Bitmap dateBitmap(Bitmap bitmap, String date) {if (bitmap == null) {return null;}int w = bitmap.getWidth();int h = bitmap.getHeight();// 创建一个空白的bitmapBitmap newbitmap = Bitmap.createBitmap(w, h, Config.ARGB_8888);// 创建一个新的和SRC长度宽度一样的位图Canvas canvas = new Canvas(newbitmap);canvas.drawBitmap(bitmap, 0, 0, null);// 在 0,0坐标开始画入srcPaint paint = new Paint();paint.setStyle(Paint.Style.FILL);paint.setColor(Color.RED);paint.setTextSize(25);// canvas.drawText(date, 80, 50, paint);//居顶canvas.drawText(date, 80, 620, paint);// 居底canvas.save(Canvas.ALL_SAVE_FLAG);// 保存canvas.restore();// 存储return newbitmap;}public void onPictureTaken(byte[] _data, Camera camera) {data = _data;showDialog(1);// 弹出对话框,提示是否要保存图片}// Menu菜单public boolean onCreateOptionsMenu(Menu menu) {super.onCreateOptionsMenu(menu);menu.add(0, ITEM0, 0, "相册");menu.add(0, ITEM2, 2, "退出");menu.findItem(ITEM1);return true;}// Menu菜单点击事件public boolean onOptionsItemSelected(MenuItem item) {switch (item.getItemId()) {case ITEM0:// 相册Intent intent = new Intent(Main.this, Album.class);startActivity(intent);break;case ITEM2:// 退出finish();break;}return super.onOptionsItemSelected(item);}}?