您的位置:首页 > 移动开发 > Android开发

android基础--拍照功能

2011-10-18 17:44 274 查看
public class MainActivity extends Activity {

private Camera camera;

private RelativeLayout buttonlayout;

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

requestWindowFeature(Window.FEATURE_NO_TITLE);//设置为没有标题

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);//设置窗口全屏显示

buttonlayout= (RelativeLayout) this.findViewById(R.id.buttonlayout);//找到相对布局(为了让相对布局中的按钮在触摸屏幕后显示)

Button duijiaoButton= (Button) this.findViewById(R.id.duijiao);//找到对焦按钮

Button takepictureButton= (Button) this.findViewById(R.id.takepicture);//找到拍照按钮

setContentView(R.layout.main);

//要先创建SurfaceView找到控件,才能打开摄像头

SurfaceView surfaceView = (SurfaceView) this.findViewById(R.id.surfaceView);//得到surfaceView控件

surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);//把输送给SurfaceView控件的内容直接输出到画面上

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

surfaceView.getHolder().addCallback(new SurfaceCallback());//设置回调,当SurfaceView被创建的时候调用SurfaceCallback方法

ButtonClickListener listener = new ButtonClickListener();

takepictureButton.setOnClickListener(listener);

duijiaoButton.setOnClickListener(listener);

}

private final class ButtonClickListener implements View.OnClickListener{

public void onClick(View v) {

if(camera != null){

if(v.getId()==R.id.takepicture){//处理拍照按钮

//camera.takePicture(shutter, raw, jpeg)

//shutter:用户摁下快门时候的回调 ;raw:拍下来的照片未经压缩的一个原始数据的回调;jpeg:压缩后的类型

camera.takePicture(null, null, new MyPictureCallback());//前两个参数不需要得到

/* 摄像头在某一时刻只能处理一项工作,现在在拍照片,拍完照片就不会预览了,现在希望拍完后继续预览

camera.startPreview();重新开始预览

但是拍照和预览是异步的,需要在拍照完全结束后才能预览,

所以放到保存完照片以后再在做预览这个操作

在下面MyPictureCallback中设置

*/

buttonlayout.setVisibility(ViewGroup.GONE);//拍照结束后把按钮再隐藏掉

}else{//处理自动对焦功能

camera.autoFocus(null);//对焦

}

}

}

private final class MyPictureCallback implements PictureCallback{

public void onPictureTaken(byte[] data, Camera camera) {

try {

File file = new File(Environment.getExternalStorageDirectory(),System.currentTimeMillis()+".jpg");

FileOutputStream outputStream = new FileOutputStream(file);

outputStream.write(data);

outputStream.close();

camera.startPreview();//在这里设置重新开始预览

} catch (Exception e) {

e.printStackTrace();

}

}

}

}

//触摸屏幕时要显示 对焦和拍照两个按钮,这里重写onTouchEvent方法来实现。为了一开始不显示这两个按钮,要在main.xml中设置visibility="gone"来隐藏按钮

public boolean onTouchEvent(MotionEvent event) {

if(event.getAction() == MotionEvent.ACTION_DOWN){//触摸事件为摁下

buttonlayout.setVisibility(ViewGroup.VISIBLE);//让按钮显示

}

return super.onTouchEvent(event);

}

//回调函数

private final class SurfaceCallback implements Callback{

public void surfaceCreated(SurfaceHolder holder) {

try {

camera = Camera.open();//打开摄像头,一个摄像头在同一时刻只能被一个应用使用

Parameters parameters = camera.getParameters();//构建一个参数对象

//某些设备只允许设置它清单中的值,不允许随意设置值,比如HTC的手机摄像头规定了照片大小。所以用Log来看下设备允许的参数值

Log.i("MainActivity",parameters.flatten());//往控制台输出可以使用的各项参数和各项参数可以使用的值,根据参数和对应的值进行设置

parameters.setPreviewSize(800, 480);//设置预览图片大小

parameters.setPreviewFrameRate(5);//每秒钟从摄像头捕获画面的个数

parameters.setPictureSize(640, 480);//照片大小

parameters.setPreviewFormat(ImageFormat.JPEG);//设置照片格式为JPG

camera.setParameters(parameters);//把参数对象设给照相机

//设置需要哪个SurfaceView来显示摄像头所捕获的画面

camera.setPreviewDisplay(holder);

camera.startPreview();//把预览的画面显示在屏幕上,开始预览

} catch (IOException e) {

e.printStackTrace();

}

}

public void surfaceChanged(SurfaceHolder holder, int format, int width,

int height) {

}

public void surfaceDestroyed(SurfaceHolder holder) {

if(camera!=null)

camera.release();//当MainActivity 离开前台,要释放掉摄像头

camera = null;

}

}

}

要加三个权限:

<!-- 设置摄像头的访问权限 -->
<uses-permission android:name="android.permission.CAMERA"/>
<!-- 在SDCard中创建与删除文件权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<!-- 往SDCard写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐