用户头像——图片剪切相机拍照从相册选图的坑

更换用户头像功能,拍照或者从相册选取之后剪切 然后上传。
有些模拟器没有相机程序 就会导致ActivityNotFoundException
所以最好try一下

  Intent takePhoto = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);//启动相机
   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            //如果是7.0及以上的系统使用FileProvider的方式创建一个Uri
            mImageUri = FileProvider.getUriForFile(EditUserInfoActivity.this, getApplicationContext().getPackageName() + ".provider", new File(mFilePath, mFileName));
            takePhoto.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);//允许跳转到的目标对uri执行读写权限。
            takePhoto.setFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
        } else {
            //7.0以下使用这种方式创建一个Uri
            mImageUri = Uri.fromFile(new File(mFilePath, mFileName));
        }
    takePhoto.putExtra(MediaStore.EXTRA_OUTPUT, mImageUri);//根据uri保存图片或视频 mediaStore
   try {
            startActivityForResult(takePhoto, USE_CAMERA);//设置带返回值的跳转
        } catch (ActivityNotFoundException e) {
            Toast.makeText(this, "没有找到相机程序", Toast.LENGTH_SHORT).show();
        }

从相册选择

  Intent pic = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);

有些设备也是没有图片选择 就会报没有activity handle Intent.ACTION_PICK这个操作 所以也要try一下 没有图片选择器 就用文件管理器 然后限制选择图片

   Intent pic = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        try {
            startActivityForResult(pic, USE_PICS);
            } catch (ActivityNotFoundException e) {
            e.printStackTrace();
            Intent pic1 = new Intent(Intent.ACTION_GET_CONTENT);
            pic1.setType("image/*");
            pic1.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
            startActivityForResult(pic1, USE_PICS);
                                }

这前面都挺简单的 最恶心的是crop

 Intent cut = new Intent("com.android.camera.action.CROP");
        cut.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
        cut.setDataAndType(imageUri, "image/*");

使用 cut.setDataAndType(imageUri, “image/*”);来设置待剪切的文件的URI
然后cut.putExtra(MediaStore.EXTRA_OUTPUT, uri);保存剪切后的图片到uri指定的位置
在安卓7.0+ **

imageUri必须是Provider提供的uri

**,否则就会报错。
然而

保存剪切后图片的URI必须是URI.FromFile得到的URI

不然就会保存不成功,文件生成了,但是大小是0kb,在onActivityResult方法中返回的resultCode==RESULT_CANCEL。报的错误是CropActivity can not decode ……

最坑的来了。

这两个URI必须指向的不是同一个文件,不然的话也会保存不成功。

真tm坑死我了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值