在项目中遇到裁切图片的问题,然后测试时候发现只有小米切完了反不回来,于是查了一下发现已经有人写帖子解决问题,就是下面这段代码,
你从相册和拍照有了图片uri之后传给这个函数,此函数调用系统的裁切,
public static Intent Crop(String action, Uri uri) {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT).putExtra( MediaStore.EXTRA_OUTPUT, uri);
.setDataAndType(uri, "image/*")
.putExtra("crop", params.crop).putExtra(“true”)
.putExtra("aspectX", aspectX)
.putExtra("aspectY", aspectY)
.putExtra("outputX", outputX)
.putExtra("outputY", outputY)
.putExtra("return-data", false)
.putExtra("outputFormat", 'jpge")
.putExtra("noFaceDetection",true)
.putExtra(MediaStore.EXTRA_OUTPUT, uri);
startActivityForResult(intent,"REQ_CROP");
}
然后问题来了。
什么情况捏?
1是众所周知的小米系统在返回的onActivityResult里data为null,
2是你们大约不知道的调用系统Crop需要先创建文件,将已存在的文件的uri反给intent
3是我真的没想到的new file(uri.toString) 居然不存在,这个debug了一下才发现,创建file用的路径是 /storage/emulated/…… 而uri中存的是file:///storage/emulated/
而高潮是,这两个创建的文件居然不一样。好了,下面是解决问题的代码
/**
* 裁切临时文件
*/
public Uri getTempUri(String name){
Uri uritempFile = null;
File file = new File(Environment.getExternalStorageDirectory(),
name);
try{
file.createNewFile();
}catch(IOException e){
}
if(file.exists()){
fileTempPath = file.getPath();
uritempFile= Uri.fromFile(file);
return uritempFile;
}
return uritempFile;
}
他会返回一个uri作为裁切intent的传参,同时全局变量fileTempPath会保存文件存在的依据,在返回之后你可以通过
bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uritempFile));中bitmap的null情况来判断此次裁切是否成功。
另外补充两点:
调用系统地址:
内存:Environment.getExternalStorageDirectory()
SDcard:Environment.getExternalStorageState()