Android自定义相机流程,Android—实现自定义相机倒计时拍照

packagecom.dhsr.pujiejia.ui;importjava.io.File;importjava.io.FileOutputStream;importjava.text.SimpleDateFormat;importjava.util.Date;importandroid.annotation.SuppressLint;importandroid.app.Activity;importandroid.content.Context;importandroid.content.Intent;importandroid.content.res.Configuration;importandroid.graphics.Bitmap;importandroid.graphics.BitmapFactory;importandroid.graphics.PixelFormat;importandroid.hardware.Camera;importandroid.hardware.Camera.CameraInfo;importandroid.os.Bundle;importandroid.os.Environment;importandroid.os.Handler;importandroid.view.SurfaceHolder;importandroid.view.SurfaceView;importandroid.view.Window;importandroid.view.WindowManager;importandroid.widget.TextView;importcom.example.pujiejiaapp.R;

@SuppressLint({"NewApi", "SdCardPath"})public class CameraActivity extends Activity implementsRunnable {//预览图片范围

privateSurfaceView surfaceView;privateTextView tv_time;//倒计时拍摄

private int cameratime = 4;privateCamera camera;private boolean preview = false;//文件名字

privateString filename;//文件名字的带的时间戳

privateString timeString;//格式化时间

privateSimpleDateFormat dateFormat;//日期对象

privateDate date;//控制线程

boolean stopThread = false;privateFile file;

String photo;private Handler mHandler = newHandler() {public voidhandleMessage(android.os.Message msg) {int what =msg.what;switch(what) {case 222:

tv_time.setText("" +cameratime);if ("0".equals(tv_time.getText().toString())) {

tv_time.setText("拍摄成功!");

takePhoto();

}break;

}

};

};

@Overrideprotected voidonCreate(Bundle savedInstanceState) {//TODO Auto-generated method stub

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_test);

CameraActivity.this.setFinishOnTouchOutside(false);//初始化数据

findView();

surfaceView.getHolder().addCallback(newSufaceListener());/*下面设置Surface不维护自己的缓冲区,而是等待屏幕的渲染引擎将内容推送到用户面前*/surfaceView.getHolder()

.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

surfaceView.getHolder().setFixedSize(200, 200); //设置分辨率

}

@Overrideprotected voidonStart() {//TODO Auto-generated method stub

super.onStart();//开启线程

new Thread(this).start();

}private final class SufaceListener implementsSurfaceHolder.Callback {/*** surface改变*/@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, intwidth,intheight) {

}/*** surface创建*/@Overridepublic voidsurfaceCreated(SurfaceHolder holder) {try{for (int i = 0; i < Camera.getNumberOfCameras(); i++) {

CameraInfo info= newCameraInfo();

Camera.getCameraInfo(i, info);//调用系统的前置摄像头

if (info.facing ==CameraInfo.CAMERA_FACING_FRONT) {

camera=Camera.open(i);

}

}

Camera.Parameters parameters=camera.getParameters();/*每秒从摄像头捕获5帧画面,*/parameters.setPreviewFrameRate(5);/*设置照片的输出格式:jpg*/parameters.setPictureFormat(PixelFormat.JPEG);/*照片质量*/parameters.set("jpeg-quality", 85);

WindowManager wm=(WindowManager) getSystemService(Context.WINDOW_SERVICE);

camera.setParameters(parameters);

camera.setPreviewDisplay(surfaceView.getHolder());//通过SurfaceView显示取景画面

camera.startPreview();

preview= true;

}catch(Exception e) {

}

}/*** surface销毁*/@Overridepublic voidsurfaceDestroyed(SurfaceHolder holder) {if (camera != null) {if(preview)

camera.stopPreview();

camera.release();

camera= null;

}

}

}/*** 拍摄照片*/

private voidtakePhoto() {//执行拍照效果

camera.takePicture(null, null, newCamera.PictureCallback() {

@Overridepublic void onPictureTaken(byte[] data, Camera camera) {try{

Bitmap bitmap= BitmapFactory.decodeByteArray(data, 0,

data.length);

timeString=formatDate();//保存到data/data目录自定义文件夹下

filename = "/data/data/com.example.pujiejiaapp/images/"

+ timeString + ".jpg";

File file= newFile(filename);boolean createNewFile =file.createNewFile()

System.out.println("创建文件夹成功没有" +createNewFile);

System.out.println(file);

FileOutputStream outStream= newFileOutputStream(file);

bitmap.compress(Bitmap.CompressFormat.JPEG,60, outStream);

outStream.flush();

outStream.close();//重新浏览

camera.stopPreview();

camera.startPreview();

preview= true;

}catch(Exception e) {

e.printStackTrace();

}finally{

}

}

});

}

@Overridepublic voidrun() {while (!stopThread) {try{//按秒数倒计时

Thread.sleep(1000);

}catch(InterruptedException e) {//TODO Auto-generated catch block

e.printStackTrace();

}

cameratime--;

mHandler.sendEmptyMessage(222);if (cameratime <= 0) {break;

}

}

}//初始化数据

private voidfindView() {

surfaceView= (SurfaceView) this.findViewById(R.id.surfaceView);

tv_time=(TextView) findViewById(R.id.tv_time);

}//格式化系统的时间

publicString formatDate() {

date= newDate(System.currentTimeMillis());//日期格式

dateFormat = new SimpleDateFormat("'IMG'_yyyyMMddHHmmss");returndateFormat.format(date);

}

@Overrideprotected voidonDestroy() {//TODO Auto-generated method stub//线程已关闭

super.onDestroy();

stopThread= true;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值