android开发之Camera(相机)

来源:互联网 发布:淘宝接单app软件 编辑:程序博客网 时间:2024/05/19 18:37

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

*使用surfaceview进行预览

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

1.布局文件:

<SurfaceView android:id="@+id/svPreview" android:layout_width="match_parent" android:layout_height="match_parent" />

2.为surfaceview设置callback
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         */@Overridepublic 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         */@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {//自动对焦mCamera.autoFocus(null);}    /**         * 销毁的时候调用         * @param holder         */@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {    //释放camera    if(mCamera != null){    mCamera.release();    mCamera = null;    }    }    }


3.拍照开始

@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.旋转图片
/** * 旋转照片 * * @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.保存照片
/** * 保存图片 * @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();    }}


1 0