Android多媒体开发之旅(Android Camera 开发 1)

Camera开重点内容发准备工作:


1.权限

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

2.预览视图

2.1 SurfaceView的设置

SurfaceView surfaceView ;//获取一个SurfaceView实例,可以在布局中声明
surfaceView.getHolder().setKeepScreenOn(true);// 屏幕常亮
 surfaceView.getHolder().setFixedSize(640, 640);//设置分辨率
surfaceView.getHolder().addCallback(new SurfaceCallback());//添加一个回调函数 <**重点**>

2.2 SurfaceView(回调函数)和Camera的绑定

private class SurfaceCallback implements SurfaceHolder.Callback {
               @Override
        public void surfaceCreated(SurfaceHolder holder) {
            try {
                mCamera = Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK); // 打开摄像头
                mCamera.setPreviewDisplay(holder); // 设置预览的试图对象
                //根据屏幕方向 调整 相机方向(横屏时一切正常,竖屏需要调整,旋转90°)
                mAdjustDegree = adjustDegree(MainActivity.this);
                mCamera.setDisplayOrientation(mAdjustDegree);
                mCamera.startPreview(); // 开始预览
            } catch (Exception e) {
                e.printStackTrace();
            }

        }
 // 拍照状态变化时(以及页面刚显示的时候)调用该方法
        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width,                                  int height) {

            parameters = mCamera.getParameters(); // 获取各项参数
            parameters.setPictureFormat(ImageFormat.JPEG); // 设置图片格式
            parameters.setPreviewSize(width, height); // 设置预览大小
            parameters.setPreviewFpsRange(4, 6);  //设置每秒显示帧
            parameters.setPictureSize(width, height); // 设置保存的图片尺寸
            parameters.setJpegQuality(100); // 设置照片质量
            mCamera.setParameters(parameters);

        }

        // 停止拍照时调用该方法
        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            if (mCamera != null) {
                mCamera.stopPreview();
                mCamera.release(); // 释放照相机
                mCamera = null;
            }
        }
    }

3 拍照并存储照片

3.1 拍照函数

 mCamera.takePicture(null, null, new MyPictureCallback());//第一个参数,快门完成回调,可以做一些声音播放等处理工作,最后一个拍照完成回调,回调函数中包含一个Byte数据,可以使用数据读取到文件中完成存储

3.2 拍照结果

 private class MyPictureCallback implements Camera.PictureCallback {
        @Override
        public void onPictureTaken(byte[] data, Camera camera) {
            try {
                saveToSDCard(data); // 保存图片到sd卡中                
                camera.startPreview(); // 拍完照后,重新开始预览
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

extra:保存照片的方法给出

 private void saveToSDCard(byte[] data) throws IOException {
        //使用当前时间作为保存图片的名字
        Date date = new Date();
        SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss"); // 格式化时间
        filename = format.format(date) + ".jpg";
        File dir = new File(Environment.getExternalStorageDirectory()
                + "/pic/");
        if (!dir.exists()) {
            dir.mkdir();
        }
        file = new File(dir, filename);
        if (!file.exists()) {
            file.createNewFile();
        }
        Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
        Matrix matrix = new Matrix();
        matrix.setRotate(180 - mAdjustDegree);
        bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
        FileOutputStream fos = new FileOutputStream(file.getPath());
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
        fos.close();
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章