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(); // 创建一个空白的bitmap Bitmap newbitmap = Bitmap.createBitmap(w, h, Config.ARGB_8888);// 创建一个新的和SRC长度宽度一样的位图 Canvas canvas = new Canvas(newbitmap); canvas.drawBitmap(bitmap, 0, 0, null);// 在 0,0坐标开始画入src Paint 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); } }