天天看點

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(, );//設定分辨率
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(, );  //設定每秒顯示幀
            parameters.setPictureSize(width, height); // 設定儲存的圖檔尺寸
            parameters.setJpegQuality(); // 設定照片品質
            mCamera.setParameters(parameters);

        }

        // 停止拍照時調用該方法
        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            if (mCamera != null) {
                mCamera.stopPreview();
                mCamera.release(); // 釋放照相機
                mCamera = null;
            }
        }
    }
           

3 拍照并存儲照片

3.1 拍照函數

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, , data.length);
        Matrix matrix = new Matrix();
        matrix.setRotate( - mAdjustDegree);
        bitmap = Bitmap.createBitmap(bitmap, , , bitmap.getWidth(), bitmap.getHeight(), matrix, true);
        FileOutputStream fos = new FileOutputStream(file.getPath());
        bitmap.compress(Bitmap.CompressFormat.JPEG, , fos);
        fos.close();
    }