android的camera

来源:互联网 发布:淘宝首页html代码示例 编辑:程序博客网 时间:2024/04/26 08:56

Android手机关于Camera的使用,一是拍照,二是摄像,由于Android提供了强大的组件功能,为此对于在Android手机系统上进行Camera的开发,我们可以使用两类方法:一是借助IntentMediaStroe调用系统Camera App程序来实现拍照和摄像功能,二是根据Camera API自写Camera程序。由于自写Camera需要对Camera API了解很充分,而且对于通用的拍照和摄像应用只需要借助系统Camera App程序就能满足要求了,为此先从调用系统Camera App应用开始来对Android Camera做个简单的使用小结。

 

1.在androidmanifest.xml中加入权限

<uses-permissionandroid:name="android.permission.CAMERA"/>

   <!-- 照相权限 -->

   <uses-featureandroid:name="android.hardware.camera"/>

   <!-- 聚焦 -->

   <uses-featureandroid:name="android.hardware.camera.autofocus"/>

   <!-- SDCard中创建与删除文件权限 -->

   <uses-permissionandroid:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

   <!-- SDCard写入数据权限 -->

   <uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

2.代码书写

//调用摄像头

Button camera=(Button)findViewById(R.id.camera);

       camera.setOnClickListener(newOnClickListener() {

        @Override

        publicvoidonClick(View v) {

           // TODO Auto-generated method stub

        Intentintent=newIntent(MainActivity.this,Cameradome.class);

        startActivity(intent);

        }

      });

}

 

跳转类

package com.example.a3;

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.MotionEvent;

import android.view.SurfaceHolder;

import android.view.SurfaceView;

import android.view.View;

import android.view.ViewGroup;

import android.view.Window;

import android.view.WindowManager;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.Toast;

 

publicclassCameradome extendsActivity {

   /*

    * author

    */

   private SurfaceViewsurface;

   private Buttonpaizhao;

   private SurfaceHolderHolder;

   private Cameracam;// 导入硬件的包

   private Viewlayout1, layout2;

   privateint i = 0;

   privateboolean focus =false;

   privateboolean previewRunning =true;//判断回调

   privateint count = 0;//计算点击的次数

   privatelong firsttime;

   privatelong lasttime;

 

   @Override

   protectedvoid onCreate(BundlesavedInstanceState) {

      super.onCreate(savedInstanceState);

      requestWindowFeature(Window.FEATURE_NO_TITLE);

      getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,

           WindowManager.LayoutParams.FLAG_FULLSCREEN);//全屏显示

      setContentView(R.layout.activity_camera);

      paizhao = (Button)findViewById(R.id.camera);

      surface = (SurfaceView)findViewById(R.id.surface);

      layout1 = findViewById(R.id.buttonlayout);

      layout2 = findViewById(R.id.stoplayout);

 

      Holder =surface.getHolder();

      Holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);//增加缓冲区处理

      Holder.setKeepScreenOn(true);//保持持续拍照

      Holder.addCallback(newMySurfaceViewCallback());//添加操作

      Holder.setFixedSize(1280,720);//设置像素

 

      this.paizhao.setOnClickListener(new onclicklistener());

   }

 

   @Override

   publicbooleanonTouchEvent(MotionEvent event) {

      //TODO Auto-generated method stub

      if (event.getAction() ==MotionEvent.ACTION_DOWN) {

        if (firsttime != 0 && System.currentTimeMillis()-firsttime> 500) {

           count = 0;

        }

        count++;

        if (count == 1) {

           firsttime = System.currentTimeMillis();

           // 单击

           layout1.setVisibility(ViewGroup.VISIBLE);//显示,显示为0不显示为8

           Toast.makeText(this,"对焦", Toast.LENGTH_SHORT).show();

           cam.autoFocus(newAutoFocusCallbackimpl());//聚焦 focus = false;

        }elseif(count== 2) {

           lasttime = System.currentTimeMillis();

           if (lasttime -firsttime < 500) {

              // 双击

              layout1.setVisibility(ViewGroup.GONE);

              Toast.makeText(this,"double Touch",1).show();

           }

           count = 0;

           firsttime = 0;

           lasttime = 0;

        }

      }

      returntrue;

 

   }

 

   publicvoid changecamera(View v) {

      //换摄像头

      if (i == 0) {

        i = 1;

      }else{

        i = 0;

      }

      cam.stopPreview();//停掉原来摄像头的预览

      cam.release();//释放资源

      cam =null;//取消原来摄像头

      cam = Camera.open(i);//打开当前选中的摄像头

      try {

        cam.setPreviewDisplay(Holder);//通过surfaceview显示取景画面

      }catch(IOException e) {

        // TODO Auto-generated catch block

        e.printStackTrace();

      }

      cam.startPreview();//开始预览

      previewRunning =true;

 

      /*

       * cam.stopPreview();//停止预览

       * layout1.setVisibility(ViewGroup.GONE);//显示,显示为0不显示为8

       * layout2.setVisibility(ViewGroup.VISIBLE);//显示,显示为0不显示为8

       */

   }

 

   privateclass onclicklistener implements OnClickListener{

 

      //拍照

      @Override

      publicvoid onClick(View v) {

        // TODO Auto-generated method stub

        if (cam !=null) {

           cam.autoFocus(newAutoFocusCallbackimpl());

           if (focus ==true) {

              cam.takePicture(sc, pc, jpgcall);

              focus = false;

           }

        }

      }

   }

 

   // 操作

   privateclass MySurfaceViewCallback implementsSurfaceHolder.Callback {

 

      @Override

      publicvoidsurfaceCreated(SurfaceHolder holder) {

        // TODO Auto-generated method stub

        // 预览打开camera

        cam = Camera.open(i);//取得后摄像头

        WindowManagermanager = (WindowManager) Cameradome.this

              .getSystemService(Context.WINDOW_SERVICE);//取得手机的宽度和高度进行内容填充

        Displaydisplay = manager.getDefaultDisplay();//通过display得到相机的一些屏幕参数

        Parametersparam = cam.getParameters();

        param.setPreviewSize(display.getWidth(),display.getHeight());//设置预览大小

        param.setPreviewFrameRate(5);//一秒5帧帧数越高越清晰;

        param.setPictureFormat(PixelFormat.JPEG);//图片形式

        param.set("jpen-quality",85);//图片质量

        cam.setParameters(param);

 

        try {

           cam.setPreviewDisplay(Holder);

        }catch(IOException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

        }

        cam.startPreview();// 进行预览

        previewRunning = true;

      }

 

      @Override

      publicvoidsurfaceChanged(SurfaceHolder holder,int format, int width,

           int height) {

        // TODO Auto-generated method stub

      }

 

      @Override

      publicvoidsurfaceDestroyed(SurfaceHolder holder) {

        // TODO Auto-generated method stub

        if (cam !=null) {

           if (previewRunning) {

              cam.stopPreview();// 停止预览

              previewRunning = false;

           }

           cam.release();// 释放摄像头

        }

      }

   }

 

   privateclass AutoFocusCallbackimpl implementsAutoFocusCallback {

      @Override

      publicvoid onAutoFocus(boolean success,android.hardware.Camera camera) {

        // TODO Auto-generated method stub

        if (success) {

           // 对焦成功

           focus = true;

           // cam.takePicture(sc, pc, jpgcall);//拍照

        }

      }

   }

   private PictureCallbackjpgcall = new PictureCallback() {

      @Override

      publicvoid onPictureTaken(byte[] data,android.hardware.Camera camera) {

        // TODO Auto-generated method stub

        // 图片存储操作

        Bitmapbmp = BitmapFactory.decodeByteArray(data, 0, data.length);

        StringfileName = Environment.getExternalStorageDirectory()

              .toString()

              +File.separator

              +"mldnphoto"

              +File.separator

              +"MLDN_"+ System.currentTimeMillis() +".jpg";// +System.currentTimeMillis()

              // 获取系统时间

        Filefile = newFile(fileName);

        if(!file.getParentFile().exists()) {

      file.getParentFile().mkdirs();//创建文件夹

        }

        try {

           BufferedOutputStreambos =newBufferedOutputStream(

                 newFileOutputStream(file));

           bmp.compress(Bitmap.CompressFormat.JPEG, 80, bos);//向缓冲区之中压缩图片

           bos.flush();

           bos.close();

           Toast.makeText(Cameradome.this,

                 "拍照成功,照片保存在" + fileName +"文件夹中",1).show();

        }catch(FileNotFoundException e) {

           // TODO Auto-generated catch block

           Toast.makeText(Cameradome.this,"拍照失败",1).show();

           e.printStackTrace();

        }catch(IOException e) {

           // TODO Auto-generated catch block

           Toast.makeText(Cameradome.this,"拍照失败",1).show();

           e.printStackTrace();

        }

        Cameradome.this.cam.stopPreview();

        Cameradome.this.cam.startPreview();

      }

   };

   private ShutterCallbacksc = new ShutterCallback() {

      @Override

      publicvoid onShutter() {

        // TODO Auto-generated method stub

        // 按下快门的操作

      }

   };

   private PictureCallbackpc = new PictureCallback() {

      @Override

      publicvoid onPictureTaken(byte[] data,android.hardware.Camera camera) {

        // TODO Auto-generated method stub

      }

   };

}

 

0 0
原创粉丝点击