您的位置:首页 > 其它

使用手机的摄像头进行拍照

2014-06-30 22:42 423 查看
package cn.itcast.camera;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import android.app.Activity;
import android.graphics.PixelFormat;
import android.hardware.Camera;
import android.os.Bundle;
import android.os.Environment;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.Toast;

public class DemoActivity extends Activity implements OnClickListener {
private SurfaceView sv;
private Button bt_take_pic, bt_auto_focus;
private SurfaceHolder holder;
private 		Camera camera ;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//隐藏掉activity的标题栏
// 必须写到setcontentview之前
requestWindowFeature(Window.FEATURE_NO_TITLE);
//实现窗体的全屏显示
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.main);
sv = (SurfaceView) this.findViewById(R.id.sv);
bt_take_pic = (Button) this.findViewById(R.id.bt_take_pic);
bt_auto_focus = (Button) this.findViewById(R.id.bt_auto_focus);
bt_take_pic.setOnClickListener(this);
bt_auto_focus.setOnClickListener(this);
//得到holder
holder =   sv.getHolder();
//设置类型
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
//设置事件  create change destory
holder.addCallback(new MyHolderCallback());

}

public void onClick(View v) {
switch (v.getId()) {
case R.id.bt_auto_focus:
//自动对焦
camera.autoFocus(null);
break;

case R.id.bt_take_pic:
//拍照
//ShutterCallback
// raw 未经过处理的意思  设置的事件是onPictureTaken事件
camera.takePicture(null, null, new MyPicCallback());
break;
}

}
private class MyPicCallback implements Camera.PictureCallback{

public void onPictureTaken(byte[] data, Camera camera) {
if(Environment.MEDIA_MOUNTED.equals( Environment.getExternalStorageState())){
try {
File file = new File(Environment.getExternalStorageDirectory(),System.currentTimeMillis()+".jpg");
FileOutputStream fos = new FileOutputStream(file);
//得到输出流流   将数据写入文件中
fos.write(data);
fos.flush();
fos.close();

} catch (Exception e) {
Toast.makeText(getApplicationContext(), "保存照片失败", 0).show();
e.printStackTrace();
}finally{
camera.startPreview();
}
}else{
Toast.makeText(getApplicationContext(), "sd卡不可用", 0).show();
}
}
}

private class MyHolderCallback implements SurfaceHolder.Callback{

public void surfaceCreated(SurfaceHolder holder) {
System.out.println("holder 被创建 ");
DemoActivity.this.holder = holder;
//得到camara   调用底层的c语言代码,在某个事件内只能被一个应用使用,
camera = Camera.open();
// 要想给照相机设置参数 必须要知道你的相机支持什么样子的参数
//System.out.println(camera.getParameters().flatten());
Camera.Parameters parms = camera.getParameters();
//每秒显示多少帧
parms.setPreviewFrameRate(5);
parms.setPictureSize(1280, 960);
parms.setPictureFormat(PixelFormat.JPEG);//设置照片的输出格式
parms.set("jpeg-quality", 85);//照片质量

camera.setParameters(parms);
try {
//设置完参数后,给camara设置内容holder
camera.setPreviewDisplay(holder);
} catch (IOException e) {
e.printStackTrace();
}//通过SurfaceView显示取景画面
camera.startPreview();//开始预览

}

public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
}

public void surfaceDestroyed(SurfaceHolder holder) {
System.out.println("holder被销毁");
camera.release();
camera = null;

}

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: