一键式相机,图片处理裁剪和动态权限封装

    技术2022-07-11  84

    前言

    封装一个全功能的相机组件,便于上层调用。

    1. 集成相关依赖

    api 'com.github.yalantis:ucrop:2.2.2-native' api 'com.github.hotchemi:permissionsdispatcher:3.0.1' annotationProcessor 'com.github.hotchemi:permissionsdispatcher-processor:3.0.1'

    2. public class RequestCodes

    类RequestCodes存储统一的请求码

    package com.qilu.core.ui.camera; import com.yalantis.ucrop.UCrop; //请求码存储 public class RequestCodes { public static final int TAKE_PHOTO = 4; public static final int PICK_PHOTO = 5; public static final int CROP_PHOTO = UCrop.REQUEST_CROP; public static final int CROP_ERROR = UCrop.RESULT_ERROR; }

    3. public final class CameraImageBean

    类CameraImageBean存储一些中间值

    package com.qilu.core.ui.camera; import android.net.Uri; //存储一些中间值 public final class CameraImageBean { private Uri mPath = null; private static final CameraImageBean INSTANCE = new CameraImageBean(); public static CameraImageBean getInstance(){ return INSTANCE; } public Uri getPath() { return mPath; } public void setPath(Uri mPath) { this.mPath = mPath; } }

    4. public class CameraHandler

    类CameraHandler进行照片处理

    package com.qilu.core.ui.camera; import android.content.ContentValues; import android.content.Intent; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.net.Uri; import android.os.Build; import android.provider.MediaStore; import android.support.v7.app.AlertDialog; import android.view.Gravity; import android.view.View; import android.view.Window; import android.view.WindowManager; import com.blankj.utilcode.util.FileUtils; import com.qilu.core.R; import com.qilu.core.delegates.PermissionCheckerDelegate; import com.qilu.core.util.file.FileUtil; import java.io.File; import java.util.Objects; //照片处理类 public class CameraHandler implements View.OnClickListener { private final AlertDialog DIALOG; private final PermissionCheckerDelegate DELEGATE; public CameraHandler(PermissionCheckerDelegate delegate) { this.DELEGATE = delegate; DIALOG = new AlertDialog.Builder(Objects.requireNonNull(delegate.getContext())).create(); } final void beginCameraDialog(){ DIALOG.show(); final Window window = DIALOG.getWindow(); if (window != null) { window.setContentView(R.layout.dialog_camera_panel); window.setGravity(Gravity.BOTTOM); window.setWindowAnimations(R.style.anim_panel_up_from_bottom); window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); //设置属性 final WindowManager.LayoutParams params = window.getAttributes(); params.width = WindowManager.LayoutParams.MATCH_PARENT; params.flags = WindowManager.LayoutParams.FLAG_DIM_BEHIND; params.dimAmount = 0.5f; window.setAttributes(params); window.findViewById(R.id.photodialog_btn_cancel).setOnClickListener(this); window.findViewById(R.id.photodialog_btn_take).setOnClickListener(this); window.findViewById(R.id.photodialog_btn_native).setOnClickListener(this); } } private String getPhotoName() { return FileUtil.getFileNameByTime("IMG", "jpg"); } private void takePhoto() { final String currentPhotoName = getPhotoName(); final Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); final File tempFile = new File(FileUtil.CAMERA_PHOTO_DIR, currentPhotoName); //兼容7.0及以上的写法 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { final ContentValues contentValues = new ContentValues(1); contentValues.put(MediaStore.Images.Media.DATA, tempFile.getPath()); final Uri uri = Objects.requireNonNull(DELEGATE.getContext()).getContentResolver(). insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues); //需要将Uri路径转化为实际路径 final File realFile = FileUtils.getFileByPath(FileUtil.getRealFilePath(DELEGATE.getContext(), uri)); final Uri realUri = Uri.fromFile(realFile); CameraImageBean.getInstance().setPath(realUri); intent.putExtra(MediaStore.EXTRA_OUTPUT, uri); } else { final Uri fileUri = Uri.fromFile(tempFile); CameraImageBean.getInstance().setPath(fileUri); intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); } DELEGATE.startActivityForResult(intent, RequestCodes.TAKE_PHOTO); } private void pickPhoto() { final Intent intent = new Intent(); intent.setType("image/*"); intent.setAction(Intent.ACTION_GET_CONTENT); intent.addCategory(Intent.CATEGORY_OPENABLE); DELEGATE.startActivityForResult (Intent.createChooser(intent, "选择获取图片的方式"), RequestCodes.PICK_PHOTO); } @Override public void onClick(View v) { int id = v.getId(); if (id == R.id.photodialog_btn_cancel) { DIALOG.cancel(); } else if (id == R.id.photodialog_btn_take) { takePhoto(); DIALOG.cancel(); } else if (id == R.id.photodialog_btn_native) { pickPhoto(); DIALOG.cancel(); } } }

    5. public class QiluCamera

    类QiluCamera进行相机调用

    package com.qilu.core.ui.camera; import android.net.Uri; import com.qilu.core.delegates.PermissionCheckerDelegate; import com.qilu.core.util.file.FileUtil; //照相机调用类 public class QiluCamera { public static Uri createCropFile() { return Uri.parse (FileUtil.createFile("MagicMirror", FileUtil.getFileNameByTime("IMG", "jpg")).getPath()); } public static void start(PermissionCheckerDelegate delegate) { new CameraHandler(delegate).beginCameraDialog(); } }
    Processed: 0.013, SQL: 9