Android学习之简单的拍照功能

来源:互联网 发布:js静态属性 编辑:程序博客网 时间:2024/04/29 06:44
本博客源码:Android学习之简单的拍照功能      http://download.csdn.net/detail/bq1073100909/7721211本代码里面有详细注释,就不再进行讲解,按照步骤一步一步来,并不难懂。图片保存路径因手机不同而不同,我没有使用系统提供的接口来获取路径,而是使用我手机的/mnt/sdcard2,推荐使用系统提供的接口,在前面的Android博客里面已经使用。CameraDemo.java代码:[java] view plain copy    package org.dyb.camera;            import java.io.BufferedOutputStream;      import java.io.File;      import java.io.FileOutputStream;      import java.io.IOException;            import android.app.Activity;      import android.graphics.Bitmap;      import android.graphics.BitmapFactory;      import android.graphics.ColorMatrixColorFilter;      import android.graphics.Matrix;      import android.graphics.PixelFormat;      import android.hardware.Camera;      import android.hardware.Camera.AutoFocusCallback;      import android.hardware.Camera.PictureCallback;      import android.hardware.Camera.ShutterCallback;      import android.os.Bundle;      import android.util.Log;      import android.view.MotionEvent;      import android.view.SurfaceHolder;      import android.view.SurfaceView;      import android.view.View;      import android.view.View.OnClickListener;      import android.view.View.OnTouchListener;      import android.view.ViewGroup.LayoutParams;      import android.view.Window;      import android.view.WindowManager;      import android.widget.ImageButton;      import android.widget.Toast;            public class CameraDemo extends Activity implements SurfaceHolder.Callback {                private SurfaceView mPreviewSV = null; //预览SurfaceView          private SurfaceHolder mySurfaceHolder = null;          private AutoFocusCallback myAutoFocusCallback = null;          private ImageButton mPhotoImgBtn = null;          private Camera myCamera = null;          private boolean isPreview = false;          private Bitmap mBitmap = null;          private String tag="camera";                    @Override          public void onCreate(Bundle savedInstanceState) {              super.onCreate(savedInstanceState);              //设置全屏无标题              requestWindowFeature(Window.FEATURE_NO_TITLE);              Window myWindow = this.getWindow();               int flag = WindowManager.LayoutParams.FLAG_FULLSCREEN;              myWindow.setFlags(flag, flag);                            setContentView(R.layout.activity_photo);                                          //初始化SurfaceView              mPreviewSV = (SurfaceView)findViewById(R.id.previewSV);              mySurfaceHolder = mPreviewSV.getHolder();              mySurfaceHolder.setFormat(PixelFormat.TRANSLUCENT);//translucent半透明 transparent透明              mySurfaceHolder.addCallback(this);              mySurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);              //自动聚焦变量回调              myAutoFocusCallback = new AutoFocusCallback() {                  @Override                  public void onAutoFocus(boolean success, Camera camera) {                      if(success)//success表示对焦成功                      {                          Toast.makeText(getApplicationContext(), "autofocus success", Toast.LENGTH_SHORT).show();                      }                      else                      {                          Toast.makeText(getApplicationContext(), "autofocus false", Toast.LENGTH_SHORT).show();                      }                        }              };                                          mPhotoImgBtn = (ImageButton)findViewById(R.id.photoImgBtn);              //手动设置拍照ImageButton的大小为120×120,原图片大小是64×64              LayoutParams lp = mPhotoImgBtn.getLayoutParams();              lp.width = 120;              lp.height = 120;                      mPhotoImgBtn.setLayoutParams(lp);                 mPhotoImgBtn.setOnClickListener(new PhotoOnClickListener());              mPhotoImgBtn.setOnTouchListener(new MyOnTouchListener());          }                                        // SurfaceView启动时/初次实例化,预览界面被创建时,该方法被调用。          @Override          public void surfaceCreated(SurfaceHolder holder) {              myCamera = Camera.open();              try {                  myCamera.setPreviewDisplay(mySurfaceHolder);              } catch (IOException e) {                  if(null != myCamera){                      myCamera.release();                      myCamera = null;                  }                  e.printStackTrace();              }          }                // 当SurfaceView/预览界面的格式和大小发生改变时,该方法被调用          @Override          public void surfaceChanged(SurfaceHolder holder, int format, int width,                  int height) {              // TODO Auto-generated method stub              initCamera();          }                private void initCamera() {              if(isPreview){                  myCamera.stopPreview();              }                            if(myCamera != null){                  Camera.Parameters myParam = myCamera.getParameters();                  //          //查询屏幕的宽和高                  //          WindowManager wm = (WindowManager)getSystemService(Context.WINDOW_SERVICE);                  //          Display display = wm.getDefaultDisplay();                  //          Log.i(tag, "屏幕宽度:"+display.getWidth()+" 屏幕高度:"+display.getHeight());                  myParam.setPictureFormat(PixelFormat.JPEG);//设置拍照后存储的图片格式                  //查询camera支持的picturesize和previewsize                  //          List<Size> pictureSizes = myParam.getSupportedPictureSizes();                  //          List<Size> previewSizes = myParam.getSupportedPreviewSizes();                  //          for(int i=0; i<pictureSizes.size(); i++){                  //              Size size = pictureSizes.get(i);                  //              Log.i(tag, "initCamera:摄像头支持的pictureSizes: width = "+size.width+"height = "+size.height);                  //          }                  //          for(int i=0; i<previewSizes.size(); i++){                  //              Size size = previewSizes.get(i);                  //              Log.i(tag, "initCamera:摄像头支持的previewSizes: width = "+size.width+"height = "+size.height);                  //                  //          }                  //设置大小和方向等参数                  myParam.setPictureSize(1280, 960);                  myParam.setPreviewSize(960, 720);                     //myParam.set("rotation", 90);                                myCamera.setDisplayOrientation(90);                    myParam.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);                  myCamera.setParameters(myParam);                              myCamera.startPreview();                  myCamera.autoFocus(myAutoFocusCallback);                  isPreview = true;              }          }                      //销毁时被调用          @Override          public void surfaceDestroyed(SurfaceHolder holder) {              // TODO Auto-generated method stub              Log.i(tag, "SurfaceHolder.Callback:Surface Destroyed");              if(null != myCamera){                  myCamera.setPreviewCallback(null); /*在启动PreviewCallback时这个必须在前不然退出出错。这里实际上注释掉也没关系*/                  myCamera.stopPreview();                   isPreview = false;                   myCamera.release();                  myCamera = null;                   }          }                          private class PhotoOnClickListener implements OnClickListener{                    @Override              public void onClick(View v) {                  if(isPreview && myCamera!=null){                      myCamera.takePicture(myShutterCallback, null, myJpegCallback);                    }              }                        }          /*为了使图片按钮按下和弹起状态不同,采用过滤颜色的方法.按下的时候让图片颜色变淡*/          public class MyOnTouchListener implements OnTouchListener{                    public final  float[] BT_SELECTED=new float[]                      { 2, 0, 0, 0, 2,                  0, 2, 0, 0, 2,                  0, 0, 2, 0, 2,                  0, 0, 0, 1, 0 };                                    public final float[] BT_NOT_SELECTED=new float[]                      { 1, 0, 0, 0, 0,                  0, 1, 0, 0, 0,                  0, 0, 1, 0, 0,                  0, 0, 0, 1, 0 };              public boolean onTouch(View v, MotionEvent event) {                  // TODO Auto-generated method stub                  if(event.getAction() == MotionEvent.ACTION_DOWN){                      v.getBackground().setColorFilter(new ColorMatrixColorFilter(BT_SELECTED));                      v.setBackgroundDrawable(v.getBackground());                  }                  else if(event.getAction() == MotionEvent.ACTION_UP){                      v.getBackground().setColorFilter(new ColorMatrixColorFilter(BT_NOT_SELECTED));                      v.setBackgroundDrawable(v.getBackground());                                        }                  return false;              }                }                              /*为了实现拍照的快门声音及拍照保存照片需要下面三个回调变量*/          ShutterCallback myShutterCallback = new ShutterCallback()           //快门按下的回调,在这里我们可以设置类似播放“咔嚓”声之类的操作。默认的就是咔嚓。          {                    public void onShutter() {                  // TODO Auto-generated method stub                  Log.i(tag, "myShutterCallback:onShutter...");                    }          };          PictureCallback myRawCallback = new PictureCallback()           // 拍摄的未压缩原数据的回调,可以为null          {                    public void onPictureTaken(byte[] data, Camera camera) {                  // TODO Auto-generated method stub                  Log.i(tag, "myRawCallback:onPictureTaken...");                    }          };          PictureCallback myJpegCallback = new PictureCallback()           //对jpeg图像数据的回调,最重要的一个回调          {                    public void onPictureTaken(byte[] data, Camera camera) {                  // TODO Auto-generated method stub                  Log.i(tag, "myJpegCallback:onPictureTaken...");                  if(null != data){                      mBitmap = BitmapFactory.decodeByteArray(data, 0, data.length);//data是字节数据,将其解析成位图                      myCamera.stopPreview();                      isPreview = false;                  }                  //设置FOCUS_MODE_CONTINUOUS_VIDEO)之后,myParam.set("rotation", 90)失效。图片竟然不能旋转了,故这里要旋转下                  Matrix matrix = new Matrix();                  matrix.postRotate((float)90.0);                  Bitmap rotaBitmap = Bitmap.createBitmap(mBitmap, 0, 0, mBitmap.getWidth(), mBitmap.getHeight(), matrix, false);                  //保存图片到sdcard                  if(null != rotaBitmap)                  {                      saveJpeg(rotaBitmap);                  }                  //再次进入预览                  myCamera.startPreview();                  isPreview = true;              }                    private void saveJpeg(Bitmap rotaBitmap) {                  String savePath = "/mnt/sdcard2/rectPhoto/";                  File folder = new File(savePath);                  if(!folder.exists()) //如果文件夹不存在则创建                  {                      folder.mkdir();                  }                  long dataTake = System.currentTimeMillis();                  String jpegName = savePath + dataTake +".jpg";                  Log.i(tag, "saveJpeg:jpegName--" + jpegName);                  //File jpegFile = new File(jpegName);                  try {                      FileOutputStream fout = new FileOutputStream(jpegName);                      BufferedOutputStream bos = new BufferedOutputStream(fout);                            //          //如果需要改变大小(默认的是宽960×高1280),如改成宽600×高800                      //          Bitmap newBM = rotaBitmap.createScaledBitmap(rotaBitmap, 600, 800, false);                            rotaBitmap.compress(Bitmap.CompressFormat.JPEG, 100, bos);                      bos.flush();                      bos.close();                      Log.i(tag, "saveJpeg:存储完毕!");                  } catch (IOException e) {                      // TODO Auto-generated catch block                      Log.i(tag, "saveJpeg:存储失败!");                      e.printStackTrace();                  }              }          };                    @Override          public void onBackPressed()          //无意中按返回键时要释放内存          {              // TODO Auto-generated method stub              super.onBackPressed();              CameraDemo.this.finish();          }                  }  activity_photo.xml布局文件代码:[html] view plain copy    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"          xmlns:tools="http://schemas.android.com/tools"          android:layout_width="fill_parent"          android:layout_height="fill_parent"          android:orientation="vertical" >                <TextView              android:layout_width="wrap_content"              android:layout_height="wrap_content"              android:text="@string/wish"              tools:context=".RectPhoto" />          <FrameLayout              android:layout_width="wrap_content"              android:layout_height="wrap_content"               >                    <SurfaceView                  android:id="@+id/previewSV"                  android:layout_width="fill_parent"                  android:layout_height="800px"/>                        </FrameLayout>                    <ImageButton              android:id="@+id/photoImgBtn"              android:layout_width="wrap_content"              android:layout_height="wrap_content"              android:background="@drawable/photo_img_btn"              android:layout_gravity="center" />                </LinearLayout>  全局配置文件:AndroidManifest.xml[html] view plain copy    <manifest xmlns:android="http://schemas.android.com/apk/res/android"          package="org.dyb.camera"          android:versionCode="1"          android:versionName="1.0" >                <uses-sdk              android:minSdkVersion="8"              android:targetSdkVersion="18" />                <application              android:allowBackup="true"              android:icon="@drawable/ic_launcher"              android:label="@string/app_name"              android:theme="@style/AppTheme" >              <activity                  android:name=".CameraDemo"                  android:label="@string/title_activity_rect_photo" >                  <intent-filter>                      <action android:name="android.intent.action.MAIN" />                      <category android:name="android.intent.category.LAUNCHER" />                  </intent-filter>              </activity>                        </application>          <!-- 增加文件存储和访问摄像头的权限 -->          <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />          <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />          <uses-permission android:name="android.permission.CAMERA" />           <uses-feature android:name="android.hardware.camera" />      </manifest>  


0 0
原创粉丝点击