权限处理
有关权限的处理,上一篇博客已经写到了,这里就不放出来了
裁剪照片
这里的裁剪图片既可以是给定的路径,也可以是调用相册之后返回的Uri。
这个是点击裁剪按钮调用的方法,第一个参数是一个意图,第二个参数是回调时用来识别的code
//裁剪指定路径的图片(不论是刚拍照完的还是从相册中取到的,只要拿到uri或者String类型的路径都可以进行裁剪)
startActivityForResult(CutForPhoto(stringToUri(Environment.getExternalStorageDirectory() + "/Pictures/"+"123.jpg")), CUT_PHOTO2);
裁剪图片
@NonNull
private Intent CutForPhoto(Uri uri) {
try {
//直接裁剪
Intent intent = new Intent("com.android.camera.action.CROP");
//设置裁剪之后的图片路径文件
File cutfile = new File(Environment.getExternalStorageDirectory().getPath(),
"cutcamera.jpg"); //随便命名一个
if (cutfile.exists()){ //如果已经存在,则先删除,这里应该是上传到服务器,然后再删除本地的,没服务器,只能这样了
cutfile.delete();
}
cutfile.createNewFile();
//初始化 uri
Uri imageUri = uri; //返回来的 uri
Uri outputUri = null; //真实的 uri
outputUri = Uri.fromFile(cutfile);
// crop为true是设置在开启的intent中设置显示的view可以剪裁
intent.putExtra("crop",true);
// aspectX,aspectY 是宽高的比例,这里设置正方形
//String sss= android.os.Build.MODEL;
if(android.os.Build.MODEL.contains("EDI-AL10")||android.os.Build.MODEL.contains("HUAWEI"))
{//华为特殊处理 不然会显示圆
intent.putExtra("aspectX", 9998);
intent.putExtra("aspectY", 9999);
}
else
{
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
}
//设置要裁剪的宽高
intent.putExtra("outputX", 300); //200dp
intent.putExtra("outputY",300);
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.toString();
e.printStackTrace();
}
return null;
}
不同的手机系统裁剪是不同的,这个裁剪进行了兼容,设置的是正方形的裁剪。这个方法需要传入一个Uri
将路径转化成Uri
这里面做了版本兼容,兼容7.0android系统
private Uri stringToUri(String path){
Uri uri = null;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
//如果是7.0android系统
ContentValues contentValues = new ContentValues(1);
contentValues.put(MediaStore.Images.Media.DATA,path);
uri=getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,contentValues);
}else{
uri = Uri.fromFile(new File(path));
}
return uri;
}