1. 程式人生 > >Android開源庫-自定義相機模組

Android開源庫-自定義相機模組

簡介

相機模組庫,自定義相機,通過簡單的呼叫即可實現拍照、圖片裁剪、錄影及錄影抓拍功能;
實現圖片壓縮,減少圖片體積;自定義相機可避免使用系統相機導致的照片或視訊體積過大問題;
內建相機及sd卡許可權獲取的處理;
github連結如下,幫忙star支援下~
github連結

實現功能:
- 拍照
- 圖片裁剪
- 錄影
- 錄影抓拍

在專案中匯入該庫

在工程的 build.gradle中加入:

allprojects {
        repositories {
            ...
            maven { url "https://jitpack.io"
} } }

module的build.gradle中加入依賴:

dependencies {
            compile 'com.github.autume:syd-camera:v1.0.0'
    }

使用

拍照

具體使用可參考demo中的CameraTestActivity

啟動相機

參照以下方式傳入圖片質量、照片最小寬度配置、相機預覽介面最小寬度配置,直接跳轉到拍照介面進行拍照;
相關的配置引數:
- picQuality:圖片質量0~100,預設80
- picWidth:照片最小寬度配置,預設800
- previewWidth:相機預覽介面最小寬度配置,預設1280
- pictureSize:照片尺寸限制,單位kb,不存入則僅根據圖片質量進行壓縮,實際壓縮後的大小會比該值略大一些

Intent intent = new Intent(CameraTestActivity.this, SydCameraActivity.class);
intent.putExtra(CameraParaUtil.picQuality, 70); //圖片質量0~100
intent.putExtra(CameraParaUtil.picWidth, 1536);  //照片最小寬度配置,高度根據螢幕比例自動配置
intent.putExtra(CameraParaUtil.previewWidth, 1280);  //相機預覽介面最小寬度配置,高度根據螢幕比例自動配置
startActivityForResult(intent, CameraParaUtil.cameraRequestCode);

接收拍照返回

拍照返回中獲取到儲存的照片路徑後可根據需求對照片進行處理,路徑獲取方式:picturePath = data.getStringExtra(CameraParaUtil.picturePath);

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
//        Log.i(TAG, "onActivityResult resultCode:" + resultCode + ",requestCode: " + requestCode);

        if (resultCode == Activity.RESULT_CANCELED){
            Log.i(TAG, "拍照取消!");
            return;
        }
        if (resultCode != Activity.RESULT_OK){
            Log.w(TAG, "拍照失敗!");
            return;
        }

        if (requestCode == CameraParaUtil.cameraRequestCode) {
            String picturePath;
            picturePath = data.getStringExtra(CameraParaUtil.picturePath);

            img_photo.setImageBitmap(BitmapFactory.decodeFile(picturePath));
            Log.d(TAG, "onActivityResult picturePath: " + picturePath);
        }
    }

圖片裁剪

啟動裁剪

參照以下方式傳入圖片質量、待裁剪圖片路徑,直接跳轉到裁剪介面進行圖片裁剪;
相關的配置引數:
- cropQuality:圖片質量0~100,預設80
- cropTitle:裁剪介面標題
- cropDestPicPath:裁剪後圖片所位於的資料夾名稱
- cropSrcPicPath:待裁剪的原始檔路徑

   private void startCrop(String path) {
        Intent intent = new Intent(CameraTestActivity.this, IcomwellCropActivity.class);
        intent.putExtra(CropParaUtil.cropQuality, 70); //圖片質量0~100
        intent.putExtra(CropParaUtil.cropTitle, "新增封面");
        intent.putExtra(CropParaUtil.cropSrcPicPath, path);
        startActivityForResult(intent, CropParaUtil.REQUEST_CODE_FROM_CUTTING);
    }

接收裁剪返回

裁剪返回中獲取儲存的裁剪後圖片路徑後可根據需求對圖片進行處理,路徑獲取:data.getStringExtra(CropParaUtil.cropDestPicPath);

     switch (requestCode) {
            case CropParaUtil.REQUEST_CODE_FROM_CUTTING:
                String cropDestPicPath;
                cropDestPicPath = data.getStringExtra(CropParaUtil.cropDestPicPath);
                img_photo.setImageBitmap(BitmapFactory.decodeFile(cropDestPicPath));
                Log.d(TAG, "onActivityResult cropDestPicPath: " + cropDestPicPath);
                break;
            default:
                break;
        }

自定義圖片裁剪UI

若需要自定義裁剪介面U,可參考SydCropActivity,自定義佈局

錄影功能

參照以下方式傳入相關引數,直接跳轉到錄影介面進行錄影;
相關的配置引數:
- picQuality:錄影質量0~100,預設80
- picWidth:視訊最小寬度配置,預設800
- previewWidth:相機預覽介面最小寬度配置,預設1280
- pictureSize:照片尺寸限制,單位kb,不存入則僅根據圖片質量進行壓縮,實際壓縮後的大小會比該值略大一些
- picDuration:自動抓拍時間間隔,單位秒,預設3600秒,傳入小於等於0的數則為關閉自動抓拍
- videoDuration:錄影分段間隔,單位秒,預設1800秒
照片和錄影分別位於:sydPhoto、sydVideo資料夾下

 private void startVideo() {
        Intent intent = new Intent(CameraTestActivity.this, SydVideoActivity.class);
        intent.putExtra(CameraParaUtil.picQuality, 70); //圖片質量0~100
        intent.putExtra(CameraParaUtil.picWidth, 1536);  //照片最小寬度配置,高度根據螢幕比例自動配置
        intent.putExtra(CameraParaUtil.previewWidth, 1280);  //相機預覽介面最小寬度配置,高度根據螢幕比例自動配置
        startActivityForResult(intent, CameraParaUtil.REQUEST_CODE_FROM_VIDEO);
    }

特殊情況相容處理

三星A8出現無許可權儲存檔案的問題,處理方式為將拍照或裁剪的圖片存於Bitmap中,直接返回Bitmap


    //裁剪後的圖片,檔案儲存失敗的情況下存入croppedBitmap
    public static Bitmap croppedBitmap;
    //拍照後的圖片,檔案儲存失敗的情況下存入pictureBitmap,裁剪時取不到本地檔案則也作為圖片裁剪的來源
    public static Bitmap pictureBitmap;

    /**
     * 相容三星A8出現無許可權儲存檔案的處理,
     * 將手機重啟後可正常儲存檔案..
     * @param resultCode
     */
    private void onResultExceptionHandle(int resultCode) {
        //拍照失敗處理,針對三星A8無法儲存檔案處理,拍照失敗後檢查CameraParaUtil.pictureBitmap是否有資料
        if (resultCode == CameraParaUtil.REQUEST_CODE_FROM_CAMERA_FAIL && CameraParaUtil.pictureBitmap != null) {
            if (Invoke.isPicNeedDeal) {
                //使用pictureBitmap進行裁剪
                startCropForBitmap();
            } else {
                //不需要裁剪
                uploadPicture(CameraParaUtil.pictureBitmap);
            }
        }

        //裁剪失敗處理,針對三星A8無法儲存檔案處理,失敗後檢查CropParaUtil.croppedBitmap是否有資料
        if (resultCode == CropParaUtil.REQUEST_CODE_FROM_CUTTING_FAIL && CropParaUtil.croppedBitmap != null) {
            uploadPicture(CropParaUtil.croppedBitmap);
        }
    }