更换用户头像功能,拍照或者从相册选取之后剪切 然后上传。
有些模拟器没有相机程序 就会导致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坑死我了。