android 简单照相机

来源:互联网 发布:民谣 知乎 编辑:程序博客网 时间:2024/05/01 18:17
MyCameraDemo.javaandroid简单照相机的实现Camera操作类及SurfaceView捕获图像组件package org.lxh.demo;import java.io.BufferedOutputStream;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import android.app.Activity;import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.PixelFormat;import android.hardware.Camera;import android.hardware.Camera.AutoFocusCallback;import android.hardware.Camera.Parameters;import android.hardware.Camera.PictureCallback;import android.hardware.Camera.ShutterCallback;import android.os.Bundle;import android.os.Environment;import android.view.Display;import android.view.SurfaceHolder;import android.view.SurfaceView;import android.view.View;import android.view.View.OnClickListener;import android.view.WindowManager;import android.widget.Button;import android.widget.Toast;public class MyCameraDemo extends Activity {private SurfaceView surfaceview=null;private Button button=null;private Camera camera=null;private SurfaceHolder holder=null;//定义一个摄像头资源捕获图像被销毁的时间private boolean previewRunTime=true;//@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);super.setContentView(R.layout.main);this.surfaceview=(SurfaceView)super.findViewById(R.id.surface);this.button=(Button)super.findViewById(R.id.but);this.holder=this.surfaceview.getHolder();this.holder.addCallback(new MySurfaceViewCallback());this.holder.setFixedSize(500, 350);//捕获范围this.button.setOnClickListener(new OnClickListenerImpl());}/** * 拍照 * @author yuhang * */private class OnClickListenerImpl implements OnClickListener{@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stubif(MyCameraDemo.this.camera!=null){MyCameraDemo.this.camera.autoFocus(new MyAutoFocusCallback());//实现自动对焦功能}}}/** * 预览 * @author yuhang * */private class MySurfaceViewCallback implements SurfaceHolder.Callback{@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {// TODO Auto-generated method stub}//@Overridepublic void surfaceCreated(SurfaceHolder holder) {// TODO Auto-generated method stubMyCameraDemo.this.camera.open();//取得第一个摄像头/**To create windows on a different display,  * you need to obtain a WindowManager for that Display. *  * Returns * The display that this window manager is managing. */WindowManager manager=(WindowManager)MyCameraDemo.this.getSystemService(Context.WINDOW_SERVICE);Display display=manager.getDefaultDisplay();//Provides information about the size and density of a logical display.Parameters param=MyCameraDemo.this.camera.getParameters();param.setPreviewSize(display.getWidth(), display.getHeight());param.setPreviewFrameRate(5);//一秒5针param.setPictureFormat(PixelFormat.JPEG);//图片形式param.set("jpen-quality",80);//图片质量MyCameraDemo.this.camera.setParameters(param);try {MyCameraDemo.this.camera.setPreviewDisplay(MyCameraDemo.this.holder);//设置预览} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}MyCameraDemo.this.camera.startPreview();//进行预览的功能MyCameraDemo.this.previewRunTime=true;//已经开始预览}//@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {// TODO Auto-generated method stubif(MyCameraDemo.this.camera!=null){//摄像头资源没释放if(MyCameraDemo.this.previewRunTime){MyCameraDemo.this.camera.stopPreview();//停止预览MyCameraDemo.this.previewRunTime=false;}MyCameraDemo.this.camera.release();//释放摄像头资源}}}/** * 只有对焦成功才能进行拍照并保存 * @author yuhang * */private class MyAutoFocusCallback implements AutoFocusCallback{@Overridepublic void onAutoFocus(boolean success, Camera camera) {// TODO Auto-generated method stubif(success){//Callback interface used to signal the moment of actual image capture.MyCameraDemo.this.camera.takePicture(shutter, pc, jpgcall);}}}/** * 照完照片后的处理操作.进行图像的保存 */private Camera.PictureCallback jpgcall=new PictureCallback() {@Override//保存图片。把byte数组中的内容变成Bitmap图片。jpegpublic void onPictureTaken(byte[] data, Camera camera) {// TODO Auto-generated method stubBitmap bmp=BitmapFactory.decodeByteArray(data, 0, data.length);/** * 图片的自动命名 */String fileName=Environment.getExternalStorageDirectory().toString()+File.separator+"mlphoto"+File.separator+"ML_"+System.currentTimeMillis()+".jpg";File file=new File(fileName);//如果file这个文件夹不存在,新建if(!file.getParentFile().exists()){file.getParentFile().mkdir();//创建文件夹}/** * Most clients will use output streams that write data to the file system (FileOutputStream),  * the network (getOutputStream()/getOutputStream()), or to an in-memory byte array * (ByteArrayOutputStream). *  * Most clients should wrap their output stream with BufferedOutputStream.  */try {BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream(file));bmp.compress(Bitmap.CompressFormat.JPEG, 80, bos);//向缓冲区之中压缩图片bos.flush();bos.close();Toast.makeText(MyCameraDemo.this, "拍照成功已保存在"+fileName+"文件中", Toast.LENGTH_SHORT).show();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}//为下一次拍照准备MyCameraDemo.this.camera.stopPreview();MyCameraDemo.this.camera.startPreview();}};private Camera.ShutterCallback shutter=new ShutterCallback() {//@Overridepublic void onShutter() {// TODO Auto-generated method stub//按下快门之后进行的操作}};private Camera.PictureCallback pc=new PictureCallback() {//@Overridepublic void onPictureTaken(byte[] data, Camera camera) {// TODO Auto-generated method stub}};}


Manifest.xml

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"package="org.lxh.demo" android:versionCode="1" android:versionName="1.0"><uses-sdk android:minSdkVersion="10" /><application android:icon="@drawable/icon" android:label="@string/app_name"><activity android:name=".MyCameraDemo" android:label="@string/app_name"android:screenOrientation="landscape"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application><uses-feature android:name="android.hardware.camera" /><uses-feature android:name="android.hardware.camera.autofocus" /><uses-permission android:name="android.permission.CAMERA" /><uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /></manifest>


main.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical" android:layout_width="fill_parent"android:layout_height="fill_parent"><Buttonandroid:id="@+id/but" android:layout_width="fill_parent"android:layout_height="wrap_content" android:text="照相" /><SurfaceViewandroid:id="@+id/surface"android:layout_width="fill_parent"android:layout_height="fill_parent" /> </LinearLayout>


0 0