转载请注明出处:(http://blog.csdn.net/qq_35071078/article/details/72835876)
最近的项目中用到了图片裁剪的功能,所以用到了系统自带的裁剪功能代码如下:(现在的思路是这样的,首先传入需要裁剪的图片的Uri,给系统自带的图片裁剪activity,然后进入到这个activity,当裁剪完成后,返回,在我们自己的activity调用onActivityResult,通过intent获取返回的bitmap,这个思路一般的机型没有问题,但是少部分机型会出现问题,比如我的这个小米测试机。)
/**
* 裁剪图片,进入系统自带的activity
*
* @param uri
*/
private void cropPhoto(Uri uri) {
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
Uri cropUri = Uri.fromFile(new File(
Environment.getExternalStorageDirectory().getPath() + "/fc/crop/club.png"));
intent.putExtra(MediaStore.EXTRA_OUTPUT, cropUri);
intent.putExtra("crop", "true");
// aspectX aspectY 是宽高的比例
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
// outputX outputY 是裁剪图片宽高
intent.putExtra("outputX", 150);
intent.putExtra("outputY", 150);
intent.putExtra("return-data", true);
startActivityForResult(intent, 3);
}
然后通过通过系统自带的剪裁activity返回的intent(onActivityResult)来获取bitmap。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case 1:
break;
case 2:
break;
case 3:
if (data != null) {
final File file = new File(
Environment.getExternalStorageDirectory().getPath() + "xxx.png");
new Thread() {
@Override
public void run() {
photo = HttpAssist.uploadFile(file);
}
}.start();
Bundle extras = data.getExtras();
head = extras.getParcelable("data");
if (head != null) {
/**
*
* 上传服务器代码
*
*/
//setPicToView(head);//保存在SD卡中
mImg.setImageBitmap(head);//用ImageView显示出来
}
}
break;
}
super.onActivityResult(requestCode, resultCode, data);
}
一般的机型不会出问题,但是在我的测试机mui8.2上出现了问题,报出的错误信息为:E/JavaBinder: !!! FAILED BINDER TRANSACTION !!!出现问题的地方在返回的intent,intent无法返回图片数据,是一个空的intent,类似这样”data{ }”,这就是返回的data(intent类型的对象),是空的。目前还不知道哪些机型会出现同样的状况,所以代码改成如下:
/**
* 裁剪图片
*
* @param uri
*/
private void cropPhoto(Uri uri) {
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
Uri cropUri = Uri.fromFile(new File(
Environment.getExternalStorageDirectory().getPath() + "xxx.png"));
intent.putExtra(MediaStore.EXTRA_OUTPUT, cropUri);
intent.putExtra("crop", "true");
// aspectX aspectY 是宽高的比例
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
// outputX outputY 是裁剪图片宽高
intent.putExtra("outputX", 150);
intent.putExtra("outputY", 150);
/**
* 此方法返回的图片只能是小图片(sumsang测试为高宽160px的图片)
* 故将图片保存在Uri中,调用时将Uri转换为Bitmap,此方法还可解决miui系统不能return data的问题
* intent.putExtra("return-data", true);
*/
Uri uritempFile = Uri.parse("file://" + "/" + Environment.getExternalStorageDirectory().getPath() + "xxx.png");
intent.putExtra(MediaStore.EXTRA_OUTPUT, uritempFile);
//intent.putExtra("outputFormat", Bitmap.CompressFormat.PNG.toString());
startActivityForResult(intent, 3);
}
原理就是通过系统自带的裁剪activity,直接将裁剪后的图片保存在SDCard中或者某个路径中,然后直接在其他地方通过这个路径来读取图片,而不是在返回的intent中去除bitmap,这样就ok了。