打开相机,相册,裁剪图片

简介: 打开相机,相册,裁剪图片

最近使用到了相机和图片的裁剪,在这里记录一下:


1,工具类


public class FileUtil {
  /**
    格式化模板
     */
    public static final String TIME_FORMAT = "_yyyyMMdd_HHmmss";
    //系统相机目录
    public static final String CAMERA_PHOTO_DIR =
            Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).getParent();
    private static String getTimeFormatName(String timeFormatHeader) {
        Date date = new Date(System.currentTimeMillis());
        //必须加上 单引号
        @SuppressLint("SimpleDateFormat") SimpleDateFormat dateFormat = new SimpleDateFormat("'" + timeFormatHeader + "'" + TIME_FORMAT);
        return dateFormat.format(date);
    }
  /**
     * @param timeFormatHeader 格式化的头(除去时间部分)
     * @param extension        后缀名
     * @return 返回时间格式化后的文件名
     */
    public static String getFileNameByTime(String timeFormatHeader, String extension) {
        return getTimeFormatName(timeFormatHeader) + "." + extension;
    } 
     /**
     * 这个方法是吧Uri 转换成真实路径,也就是photo的path
     */
    public static String getRealFilePath(final Context context, final Uri uri) {
        if (uri == null) {
            return null;
        }
        final String scheme = uri.getScheme();
        String date = null;
        if (scheme == null) {
            date = uri.getPath();
        } else if (ContentResolver.SCHEME_FILE.equals(scheme)) {
            date = uri.getPath();
        } else if (ContentResolver.SCHEME_CONTENT.equals(scheme)) {
            //从内容提供器中 查询数据
            final Cursor cursor = context.getContentResolver().query(uri, new String[]{
                            MediaStore.Images.ImageColumns.DATA}
                    , null, null, null);
            if (cursor != null) {
                if (cursor.moveToNext()) {
                    final int index = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
                    if (index > -1) {
                        date = cursor.getString(index);
                    }
                }
                cursor.close();
            }
        }
        return date;
    }
}


2,设置 code


public class RequestCode {
    /**
     * 拍照
     */
    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;
    /**
     * 扫描二维码
     */
    public static final int SCAN = 7;
}


3,设置保存路径的bean类


public final class CameraImageBean {
    private Uri mPath = null;
    private CameraImageBean(){}
    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,动态请求权限,


如果是android 6.0 以上则需要申请权限。


申请权限我就不多说了,不懂的可以看下这篇文章 权限申请的简单封装


5,打开相机


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);
        //如果手机 版本大于 AP24,兼容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());
            //向内容提供器中插入一条数据,使用url 参数来确定要添加的表,
            //待添加的数保存在values 参数中,添加完成后 染回一个表示这条记录的url
            final Uri uri = DELEGATE.getContext().getContentResolver()
                    .insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,contentValues);
            //需要将Uri 路径转化为 实际路径
            final File readFile = FileUtils.getFileByPath(FileUtil.getRealFilePath(DELEGATE.getContext(),uri));
            final Uri realUri = Uri.fromFile(readFile);
            //保存照片的路径
            CameraImageBean.getInstance().setPath(realUri);
            //将拍的照片保存在指定的 URI
            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,RequestCode.TAKE_PHOTO);
    }
  private String getPhotoName(){
        return FileUtil.getFileNameByTime("IMG","jpg");
    }


上面 FileUtils 是 utilcode 库里面的类,封装了非常多的工具,非常好用


implementation 'com.blankj:utilcode:1.23.7'


6,打开相册


/**
     * 打开 选择图片
     */
    private void pickPhoto(){
        final Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
        intent.setType("image/*");
        intent.addCategory(Intent.CATEGORY_OPENABLE);
        DELEGATE.startActivityForResult(intent,RequestCode.PICK_PHOTO);
    }


7,回调


public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK) {
        switch (requestCode) {
            case RequestCode.TAKE_PHOTO:
                final Uri resultUri = CameraImageBean.getInstance().getPath();
                //剪裁图片,第一个为原始路径,第二个为要保存的路径,
                UCrop.of(resultUri,resultUri)
                        .withMaxResultSize(400,400)
                        .start(getContext(),this);
                break;
            case RequestCode.PICK_PHOTO:
                if (data != null){
                    //从相册取的 原路径
                    final Uri pickPath = data.getData();
                    //从相册选择后需要有个路径存放剪裁后的图片
                    final String pickCropPath = LatteCamera.createCropFile().getPath();
                    //裁剪图片
                    UCrop.of(pickPath,Uri.parse(pickCropPath))
                            .withMaxResultSize(400,400)
                            .start(getContext(),this);
                }
                break;
            case RequestCode.CROP_PHOTO:
                //裁剪完成后的uri
                final Uri cropUri = UCrop .getOutput(data);
                break;
            case RequestCode.CROP_ERROR:
                Toast.makeText(getContext(), "剪裁出错", Toast.LENGTH_SHORT).show();
                break;
            default:
                break;
        }
    }
}


上面裁剪 工具 使用的是 ucrop 库,


依赖如下:


implementation 'com.github.yalantis:ucrop:2.2.3-native'


具体配置和使用,可以在百度上搜一下。资料非常多


相关文章
|
小程序 JavaScript
小程序本地相册选择图片或相机拍照底部弹框功能
小程序本地相册选择图片或相机拍照底部弹框功能
93 0
|
11月前
HTML+CSS制作3D旋转相册
HTML+CSS制作3D旋转相册
|
缓存 监控 前端开发
调用摄像机播放画面,并且实现录制GIF动图预览和下载
调用摄像机播放画面,并且实现录制GIF动图预览和下载
|
移动开发 前端开发 JavaScript
【移动端】实现相册的上传和缩放裁剪
做项目时,在移动端,需要实现用户相册图片的上传,并对图片进行缩放裁剪的功能。下面说一下实现流程。
219 1
【移动端】实现相册的上传和缩放裁剪
|
JavaScript 前端开发
3D旋转相册+背景音乐
3D旋转相册+背景音乐
3D旋转相册+背景音乐
选择图片——相机与相册
选择图片——相机与相册
82 0
|
iOS开发
iOS开发 - 保存图片到相册和保存屏幕截图到相册
iOS开发 - 保存图片到相册和保存屏幕截图到相册
685 0
|
移动开发 JavaScript
h5 实现调用系统拍照或者选择照片并预览
调用手机相机拍照或者是调用手机相册选择照片,这个功能在 手机端页面 或者 webApp 应该是常用到的,就拿个人或会员资料录入那块来说就已经是经常会碰到的, 每当看到这块功能的时候,前端的小伙伴就得去找各种各样的插件。
2996 0