android开发之Camera

今天学习了android开发中的相机的开发,总结了关于android中相机的开发流程:

*使用surfaceview进行预览

*需要开启的权限
  1. <uses-permission android:name=“android.permission.CAMERA”/>  
  2. <uses-permission android:name=“android.permission.WRITE_EXTERNAL_STORAGE”/>  
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

1.布局文件:

  1. <SurfaceView  
  2.  android:id=“@+id/svPreview”  
  3.  android:layout_width=“match_parent”  
  4.  android:layout_height=“match_parent” />  
<SurfaceView
 android:id="@+id/svPreview"
 android:layout_width="match_parent"
 android:layout_height="match_parent" />

2.为surfaceview设置callback
  1. mSfPreview.getHolder().addCallback(new SfCallback());  
  2.   
  3. public class SfCallback implements SurfaceHolder.Callback{  
  4.   
  5.    /** 
  6.      * 设置相机属性 
  7.      */  
  8. void setCamera(){  
  9.   
  10. Camera.Parameters parameters = mCamera.getParameters();  
  11. //得到相机支持的拍照分辨率,按大小排列(有的手机从大到小,有的从小到大)  
  12. List<Camera.Size> listSize = parameters .getSupportedPictureSizes();  
  13. // 从大到小排列的情况下,设置照片的大小,只能设置成支持的size,不能随意设置  
  14. //不同的机型,listSize中的值的顺序不同,需要查看本机在哪个值的时候最清晰  
  15. parameters.setPictureSize(listSize.get(0).width,listSize.get(0).height);  
  16.   
  17. // 设置图片格式  
  18. parameters.setPictureFormat(ImageFormat.JPEG);  
  19.   
  20. //默认情况下相机是横向的,这里只是改变预览的方向  
  21.  mCamera.setDisplayOrientation(90);  
  22.  //将参数设置到Camera对象中  
  23.  mCamera.setParameters(parameters);  
  24. }  
  25.   
  26.      /** 
  27.          * 创建的时候调用 
  28.          * @param holder 
  29.          */  
  30. @Override  
  31. public void surfaceCreated(SurfaceHolder holder) {  
  32. mCamera = Camera.open();//打开相机  
  33.         try {  
  34.   
  35.             setCamera();  
  36.         mCamera.setPreviewDisplay(holder);  
  37.         mCamera.startPreview();  
  38.   
  39. catch (IOException e) {  
  40.             e.printStackTrace();  
  41. }  
  42.   
  43.     }  
  44.        /** 
  45.          * 状态改变的时候调用 
  46.          * @param holder 
  47.          * @param format 
  48.          * @param width 
  49.          * @param height 
  50.          */  
  51. @Override  
  52. public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {  
  53. //自动对焦  
  54. mCamera.autoFocus(null);  
  55. }  
  56.     /** 
  57.          * 销毁的时候调用 
  58.          * @param holder 
  59.          */  
  60. @Override  
  61. public void surfaceDestroyed(SurfaceHolder holder) {  
  62.   
  63.     //释放camera  
  64.     if(mCamera != null){  
  65.     mCamera.release();  
  66.     mCamera = null;  
  67.     }  
  68.     }      
  69. }  
mSfPreview.getHolder().addCallback(new SfCallback());

public class SfCallback implements SurfaceHolder.Callback{

   /**
     * 设置相机属性
     */
void setCamera(){

Camera.Parameters parameters = mCamera.getParameters();
//得到相机支持的拍照分辨率,按大小排列(有的手机从大到小,有的从小到大)
List<Camera.Size> listSize = parameters .getSupportedPictureSizes();
// 从大到小排列的情况下,设置照片的大小,只能设置成支持的size,不能随意设置
//不同的机型,listSize中的值的顺序不同,需要查看本机在哪个值的时候最清晰
parameters.setPictureSize(listSize.get(0).width,listSize.get(0).height);

// 设置图片格式
parameters.setPictureFormat(ImageFormat.JPEG);

//默认情况下相机是横向的,这里只是改变预览的方向
 mCamera.setDisplayOrientation(90);
 //将参数设置到Camera对象中
 mCamera.setParameters(parameters);
}

     /**
         * 创建的时候调用
         * @param holder
         */
@Override
public void surfaceCreated(SurfaceHolder holder) {
mCamera = Camera.open();//打开相机
        try {

            setCamera();
        mCamera.setPreviewDisplay(holder);
        mCamera.startPreview();

} catch (IOException e) {
            e.printStackTrace();
}

    }
       /**
         * 状态改变的时候调用
         * @param holder
         * @param format
         * @param width
         * @param height
         */
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
//自动对焦
mCamera.autoFocus(null);
}
    /**
         * 销毁的时候调用
         * @param holder
         */
@Override
public void surfaceDestroyed(SurfaceHolder holder) {

    //释放camera
    if(mCamera != null){
    mCamera.release();
    mCamera = null;
    }
    }    
}



3.拍照开始

  1. @OnClick(R.id.btBegin)  
  2. public void capturePhoto(View view) {  
  3.   
  4. /*第一个参数按下快门时回调, 
  5.  *第二个参数处理原始的照片数据, 
  6.  *第三个参数处理jpeg格式照片,一般用于存放照片 
  7.  */  
  8. mCamera.takePicture(nullnullnew Camera.PictureCallback() {  
  9.     @Override  
  10.     public void onPictureTaken(byte[] data, Camera camera) {  
  11.             Bitmap bmSrc = BitmapFactory.decodeByteArray(data,  
  12.         0,data.length);  
  13.         Bitmap bmRotate = RotateBitmap(bmSrc);//旋转  
  14.         saveBitmap(bmRotate);//保存  
  15.   
  16.         //重新开启预览  
  17.         mCamera.startPreview();  
  18.     }  
  19.   
  20.     });  
  21. }  
@OnClick(R.id.btBegin)
public void capturePhoto(View view) {

/*第一个参数按下快门时回调,
 *第二个参数处理原始的照片数据,
 *第三个参数处理jpeg格式照片,一般用于存放照片
 */
mCamera.takePicture(null, null, new Camera.PictureCallback() {
    @Override
    public void onPictureTaken(byte[] data, Camera camera) {
            Bitmap bmSrc = BitmapFactory.decodeByteArray(data,
        0,data.length);
        Bitmap bmRotate = RotateBitmap(bmSrc);//旋转
        saveBitmap(bmRotate);//保存

        //重新开启预览
        mCamera.startPreview();
    }

    });
}

3.1.旋转图片
  1. /** 
  2.  * 旋转照片 
  3.  * 
  4.  * @param bmSrc 
  5. */  
  6. public Bitmap RotateBitmap(Bitmap bmSrc) {  
  7.     Bitmap bmRotate = null;  
  8.   
  9.     Matrix matrix = new Matrix();  
  10.     matrix.setRotate(90);//顺时针旋转90度  
  11.     bmRotate = Bitmap.createBitmap(bmSrc, 00,  
  12.     bmSrc.getWidth(), bmSrc.getHeight(),matrix, true);  
  13.   
  14.     bmSrc.recycle();  
  15.         return bmRotate;  
  16. }  
/**
 * 旋转照片
 *
 * @param bmSrc
*/
public Bitmap RotateBitmap(Bitmap bmSrc) {
    Bitmap bmRotate = null;

    Matrix matrix = new Matrix();
    matrix.setRotate(90);//顺时针旋转90度
    bmRotate = Bitmap.createBitmap(bmSrc, 0, 0,
    bmSrc.getWidth(), bmSrc.getHeight(),matrix, true);

    bmSrc.recycle();
        return bmRotate;
}

3.2.保存照片
  1. /** 
  2.  * 保存图片 
  3.  * @param bmToSave 
  4.  */  
  5. public void saveBitmap(Bitmap bmToSave) {  
  6.     //以时间为文件名  
  7.     SimpleDateFormat simpleDateFormat =  
  8.     new SimpleDateFormat(“yyyyMMddhhmmss”);  
  9.     String time = simpleDateFormat.format(new Date());  
  10.     File file = new File(“/sdcard/” + time + “.jpg”);  
  11.   
  12.     BufferedOutputStream bufferedOutputStream = null;  
  13.         try {  
  14.         bufferedOutputStream = new BufferedOutputStream(new     FileOutputStream(file));  
  15.     bmToSave.compress(Bitmap.CompressFormat.JPEG,  
  16.     100,bufferedOutputStream);//将图片压缩到流中  
  17.   
  18.     bufferedOutputStream.flush();//输出缓冲区的内容到本地  
  19.     bufferedOutputStream.close();//关闭  
  20.     } catch (Exception e) {  
  21.         e.printStackTrace();  
  22.     }  
  23. }  
/**
 * 保存图片
 * @param bmToSave
 */
public void saveBitmap(Bitmap bmToSave) {
    //以时间为文件名
    SimpleDateFormat simpleDateFormat =
    new SimpleDateFormat("yyyyMMddhhmmss");
    String time = simpleDateFormat.format(new Date());
    File file = new File("/sdcard/" + time + ".jpg");

    BufferedOutputStream bufferedOutputStream = null;
        try {
        bufferedOutputStream = new BufferedOutputStream(new     FileOutputStream(file));
    bmToSave.compress(Bitmap.CompressFormat.JPEG,
    100,bufferedOutputStream);//将图片压缩到流中

    bufferedOutputStream.flush();//输出缓冲区的内容到本地
    bufferedOutputStream.close();//关闭
    } catch (Exception e) {
        e.printStackTrace();
    }
}


猜你喜欢

转载自blog.csdn.net/qq_38500662/article/details/80362365