Android 相機或相冊選擇圖片裁剪

背景
這是一個我們經(jīng)常使用的功能,比如上傳頭像、身份證,本功能可選擇相機或相冊圖片后,進入裁剪頁面,并可返回Bitmap格式的圖片。

工具類SelectPicUtil

public class SelectPicUtil {

    public static final int PHOTO_REQUEST_CUT = 4;
    public static final int PHOTO_REQUEST_GALLERY = 2;
    public static final int PHOTO_REQUEST_CAMERA = 3;

    private static Uri mCutTempFile; //剪切圖片后輸出的路徑
    private static File mCameraTempFile; //拍照后的臨時文件

    public static void selectPic(final Activity activity) {
        if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
            ToastUtil.showText(activity, activity.getString(R.string.no_card), ToastUtil.ONE_SECOND);
            return;
        }

        AlertDialog.Builder builder = new AlertDialog.Builder(activity);
        builder.setItems(R.array.img_select, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                switch (which) {
                    case 0:
                        openCamera(activity);
                        break;
                    case 1:
                        openGallery(activity);
                        break;
                }
            }
        });
        AlertDialog dialog = builder.create();
        dialog.show();
    }

    /*
   * 從相冊獲取
   */
    public static void openGallery(Activity activity) {
        Intent intent = new Intent(Intent.ACTION_PICK);
        intent.setType("image/*");
        activity.startActivityForResult(intent, PHOTO_REQUEST_GALLERY);
    }

    /*
     * 從相機獲取
     */
    public static void openCamera(Activity activity) {
        mCameraTempFile = new File(Environment.getExternalStorageDirectory(), "photo_file");
        Uri uri = Uri.fromFile(mCameraTempFile);

        Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
        intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
        activity.startActivityForResult(intent, PHOTO_REQUEST_CAMERA);
    }

    /*
    * 剪切圖片
    */
    public static void openCropActivity(Activity activity,Uri uri) {
        mCutTempFile = Uri.parse("file://" + "/" + Environment.getExternalStorageDirectory().getPath() + "/" + "small.jpg");

        Intent intent = new Intent("com.android.camera.action.CROP");
        intent.setDataAndType(uri, "image/*");
        intent.putExtra("crop", "true");
        intent.putExtra("outputFormat", "JPEG");// 圖片格式
        intent.putExtra("noFaceDetection", true);// 取消人臉識別
        intent.putExtra(MediaStore.EXTRA_OUTPUT, mCutTempFile);
        intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());

        // 裁剪框的比例,1:1
        //intent.putExtra("aspectX", 1);
        //intent.putExtra("aspectY", 1);
        // 裁剪后輸出圖片的尺寸大小
        //intent.putExtra("outputX", 250);
        //intent.putExtra("outputY", 250);

        activity.startActivityForResult(intent, PHOTO_REQUEST_CUT);
    }

    public static Bitmap getAfterCropBitmap(Activity activity){
        File cameraTempFile2=SelectPicUtil.getCameraTempFile();
        if (cameraTempFile2 != null) {
            cameraTempFile2.delete();
        }

        Uri mCutTempFile=SelectPicUtil.getCutTempFile();
        Bitmap bitmap;
        try {
            bitmap = BitmapFactory.decodeStream(activity.getContentResolver().openInputStream(mCutTempFile));
        } catch (FileNotFoundException e) {
            return null;
        }
        return bitmap;
    }

    public static File getCameraTempFile() {
        return mCameraTempFile;
    }

    public static Uri getCutTempFile() {
        return mCutTempFile;
    }

}

Activity回調(diào)
調(diào)用此功能的頁面必須實現(xiàn)以下功能。

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode) {
            case SelectPicUtil.PHOTO_REQUEST_GALLERY:
                if (data != null)  SelectPicUtil.openCropActivity(this,data.getData());
                break;
            case SelectPicUtil.PHOTO_REQUEST_CAMERA:
                File cameraTempFile=SelectPicUtil.getCameraTempFile();
                if (cameraTempFile != null) SelectPicUtil.openCropActivity(this,Uri.fromFile(cameraTempFile));
                break;
            case SelectPicUtil.PHOTO_REQUEST_CUT:
                mImageView.setImageBitmap(getAfterCropBitmap(this));
                break;
        }
    }

添加權(quán)限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><!--讀取儲存-->

源碼下載地址:地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,057評論 25 709
  • The keleton of the woman is holding the skelton of a pupp...
    遼Atom閱讀 587評論 0 0
  • 成長,這個我講述不來, 噢!我用一個故事來說吧!看下面的嘍! 從前,在一個森林里,有一個小...
    崔藝婷閱讀 577評論 0 2
  • 好多天,溫度都維持在28度上下。按理說溫度不高,但是濕度大,悶悶的。很難受。尤其剛下過雨。向往北方初秋的干燥涼爽。...
    471503Liwufeng閱讀 189評論 0 0
  • 第一次看到簡書就被它干凈整潔的風(fēng)格所吸引 之前 使用過博客記下想記下的 又在github上自己搭過hexo 博客留...
    ken_2017閱讀 178評論 0 0

友情鏈接更多精彩內(nèi)容