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();
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章