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 = sv.getHolder();
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
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 未经过处理的意思
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;
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 {
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;
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<SurfaceView
android:layout_weight="100"
android:id="@+id/sv"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
<RelativeLayout
android:layout_weight="0"
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<Button
android:id="@+id/bt_take_pic"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:text="拍照" />
<Button
android:id="@+id/bt_auto_focus"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toLeftOf="@id/bt_take_pic"
android:text="对焦" />
</RelativeLayout>
</LinearLayout>
任何是摄像机功能:
package cn.itcast.videorecoder;
import java.io.IOException;
import android.app.Activity;
import android.hardware.Camera;
import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.os.Bundle;
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;
public class DemoActivity extends Activity implements OnClickListener {
private Button bt_start, bt_stop;
private SurfaceView sv;
private SurfaceHolder holder;
private Camera camera;
MediaRecorder recorder;
@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);
bt_start = (Button) this.findViewById(R.id.bt_start);
bt_stop =(Button)this.findViewById(R.id.bt_stop);
bt_start.setOnClickListener(this);
bt_stop.setOnClickListener(this);
sv = (SurfaceView) this.findViewById(R.id.sv);
holder = sv.getHolder();
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
holder.addCallback(new MySurfaceCallback());
}
private class MySurfaceCallback implements SurfaceHolder.Callback{
public void surfaceCreated(SurfaceHolder holder) {
System.out.println("surface oncreate");
DemoActivity.this.holder = holder;
/* camera = Camera.open();
try {
camera.setPreviewDisplay(holder);
} catch (IOException e) {
e.printStackTrace();
}
camera.startPreview();*/
}
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
}
public void surfaceDestroyed(SurfaceHolder holder) {
System.out.println("surface destroy");
/* camera.release();
camera = null;*/
}
}
public void onClick(View v) {
switch (v.getId()) {
case R.id.bt_start:
bt_start.setEnabled(false);
bt_stop.setEnabled(true);
recorder = new MediaRecorder();
/* recorder.reset();
// recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
// recorder.setAudioChannels(2);
// recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
recorder.setVideoSize(320, 240);
recorder.setVideoFrameRate(3); //每秒3帧
recorder.setOutputFile("/mnt/sdcard/itcast.3gp");
recorder.setPreviewDisplay(holder.getSurface());
try {
recorder.prepare();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}//预期准备
recorder.start();//开始刻录
*/
recorder.reset();
recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); //从照相机采集视频
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
recorder.setVideoSize(720, 480);
recorder.setVideoFrameRate(3); //每秒3帧
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263); //设置视频编码方式
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setOutputFile("/mnt/sdcard/itcast.3gp");
recorder.setPreviewDisplay(holder.getSurface());
try {
recorder.prepare();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}//预期准备
recorder.start();//开始刻录
break;
case R.id.bt_stop:
bt_start.setEnabled(true);
bt_stop.setEnabled(false);
if(recorder!=null){
recorder.stop();
recorder.release();
recorder = null;
}
break;
}
}
}