在你的 Androidmanifest.xml 下添加:
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<!--提供共享路径-->
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths"/>
</provider>
file_paths 名字随便取,然后在新建一个 xml 文件夹,席间 file_paths 文件填写如下代码:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<paths>
<external-path path="" name="camera_photos" />
</paths>
</resources>
/**
* 拍照之后,启动裁剪
* @param camerapath 路径
* @param imgname img 的名字
* @return
*/
@NonNull
private Intent CutForCamera(String camerapath,String imgname) {
try {
//设置裁剪之后的图片路径文件
File cutfile = new File(Environment.getExternalStorageDirectory().getPath(),
"cutcamera.png"); //随便命名一个
if (cutfile.exists()){ //如果已经存在,则先删除,这里应该是上传到服务器,然后再删除本地的,没服务器,只能这样了
cutfile.delete();
}
cutfile.createNewFile();
//初始化 uri
Uri imageUri = null; //返回来的 uri
Uri outputUri = null; //真实的 uri
Intent intent = new Intent("com.android.camera.action.CROP");
//拍照留下的图片
File camerafile = new File(camerapath,imgname);
if (Build.VERSION.SDK_INT >= 24) {
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
imageUri = FileProvider.getUriForFile(mActivity,
"{applicationId}.provider",//注意和清单文件里面的一样
camerafile);
} else {
imageUri = Uri.fromFile(camerafile);
}
outputUri = Uri.fromFile(cutfile);
//把这个 uri 提供出去,就可以解析成 bitmap了
mCutUri = outputUri;
// crop为true是设置在开启的intent中设置显示的view可以剪裁
intent.putExtra("crop",true);
// aspectX,aspectY 是宽高的比例,这里设置正方形
intent.putExtra("aspectX",1);
intent.putExtra("aspectY",1);
//设置要裁剪的宽高
intent.putExtra("outputX", ToolUtils.dip2px(mActivity,200));
intent.putExtra("outputY",ToolUtils.dip2px(mActivity,200));
intent.putExtra("scale",true);
//如果图片过大,会导致oom,这里设置为false
intent.putExtra("return-data",false);
if (imageUri != null) {
intent.setDataAndType(imageUri, "image/*");
}
if (outputUri != null) {
intent.putExtra(MediaStore.EXTRA_OUTPUT, outputUri);
}
intent.putExtra("noFaceDetection", true);
//压缩图片
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
return intent;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
/**
* 拍照之后,启动裁剪
* @param camerapath 路径
* @return
*/
@NonNull
private Intent CutForCamera(String camerapath) {
try {
//设置裁剪之后的图片路径文件
File cutfile = new File(Environment.getExternalStorageDirectory().getPath(),
"cutcamera.png"); //随便命名一个
if (cutfile.exists()){ //如果已经存在,则先删除,这里应该是上传到服务器,然后再删除本地的,没服务器,只能这样了
cutfile.delete();
}
cutfile.createNewFile();
//初始化 uri
Uri imageUri = null; //返回来的 uri
Uri outputUri = null; //真实的 uri
Intent intent = new Intent("com.android.camera.action.CROP");
//拍照留下的图片
File camerafile = new File(camerapath);
if (Build.VERSION.SDK_INT >= 24) {
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
imageUri = FileProvider.getUriForFile(mContext,
"{applicationId}.provider",//注意和清单文件里面的一样
camerafile);
} else {
imageUri = Uri.fromFile(camerafile);
}
outputUri = Uri.fromFile(cutfile);
//把这个 uri 提供出去,就可以解析成 bitmap了
photoPath_url = outputUri;
// crop为true是设置在开启的intent中设置显示的view可以剪裁
intent.putExtra("crop",true);
// aspectX,aspectY 是宽高的比例,这里设置正方形
intent.putExtra("aspectX",1);
intent.putExtra("aspectY",1);
//设置要裁剪的宽高
intent.putExtra("outputX", DensityUtil.dip2px(mContext,200));
intent.putExtra("outputY", DensityUtil.dip2px(mContext,200));
intent.putExtra("scale",true);
//如果图片过大,会导致oom,这里设置为false
intent.putExtra("return-data",false);
if (imageUri != null) {
intent.setDataAndType(imageUri, "image/*");
}
if (outputUri != null) {
intent.putExtra(MediaStore.EXTRA_OUTPUT, outputUri);
}
intent.putExtra("noFaceDetection", true);
//压缩图片
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
return intent;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
参考这个注释详细点
https://www.cnblogs.com/shenchanghui/p/6955744.html