网上搜索一大推的例子,但是当真正运行时会出现一些兼容性问题。
首先看个例子:这是从相册获取图片然后剪裁,如果是照相需要把action替换android.media.action.IMAGE_CAPTURE。
final int crop = 180; Intent intent = new Intent("android.intent.action.PICK"); intent.setDataAndType(MediaStore.Images.Media.INTERNAL_CONTENT_URI, "image/*"); intent.putExtra("output", Uri.fromFile(sdcardTempFile)); intent.putExtra("crop", "true"); intent.putExtra("aspectX", 1);// 裁剪框比例 intent.putExtra("aspectY", 1); intent.putExtra("outputX", crop);// 输出图片大小 intent.putExtra("outputY", crop); intent.putExtra("return-data", true); startActivityForResult(intent, REQUEST_CODE_CROP_PIC);
看着好像没有什么问题,运行时如果幸运的话,就OK了。
接下来测试,突然发现在6.0上面出现
1.“有些手机或高版本手机不支持照相后直接进行剪裁,所以需要照相后的图片进行剪裁”
所以,需要在调用照相机的时候去掉剪裁,在返回结果中进行剪裁,于是乎就出现了如下代码:
private void addCapture() { final int crop = 180; Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); intent.putExtra("output", Uri.fromFile(sdcardTempFile)); // intent.putExtra("crop", "true"); // intent.putExtra("aspectX", 1);// 裁剪框比例 // intent.putExtra("aspectY", 1); // intent.putExtra("outputX", crop);// 输出图片大小 // intent.putExtra("outputY", crop); startActivityForResult(intent, REQUEST_CODE_CROP_CAP); }在onActivityResult的REQUEST_CODE_CROP_CAP调用下面代码
//为了适配魅族(奇怪的现象,照相可以使用自定义的路径,相册必须使用系统的Uri)
corpCapture(Uri.fromFile(sdcardTempFile));
private void corpCapture(Uri uri) { final int crop = 180; Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(uri, "image/*"); intent.putExtra("output", Uri.fromFile(sdcardTempFile)); intent.putExtra("crop", "true"); intent.putExtra("aspectX", 1);// 裁剪框比例 intent.putExtra("aspectY", 1); intent.putExtra("outputX", crop);// 输出图片大小 intent.putExtra("outputY", crop); startActivityForResult(intent, REQUEST_CODE_IMAGE); }
2.good,好像完美的解决了一个问题,继续测试。。。
喔噢,魅族(个性使然)上出现相册中获取的图片无法剪裁,原因是不能用输出的自定义路径(更变态的是照相不能使用系统返回的Uri,只能是自定义的路径)。于是有了以下代码:
private void addImage() { final int crop = 180; Intent intent = new Intent("android.intent.action.PICK"); intent.setDataAndType(MediaStore.Images.Media.INTERNAL_CONTENT_URI, "image/*"); // intent.putExtra("output", Uri.fromFile(sdcardTempFile)); // intent.putExtra("crop", "true"); // intent.putExtra("aspectX", 1);// 裁剪框比例 // intent.putExtra("aspectY", 1); // intent.putExtra("outputX", crop);// 输出图片大小 // intent.putExtra("outputY", crop); // intent.putExtra("return-data", true); startActivityForResult(intent, REQUEST_CODE_CROP_PIC); }然后在onActivityResult的REQUEST_CODE_CROP_PIC调用下面代码
Uri selectedImage = data.getData();
corpCapture(selectedImage);
完整的onActivityResult里面的代码如下:
case REQUEST_CODE_CROP_PIC: //有些手机或高版本手机不支持照相后直接进行剪裁,所以需要照相后的图片进行剪裁 Uri selectedImage = data.getData(); corpCapture(selectedImage); // corpCapture(Uri.fromFile(sdcardTempFile)); break; case REQUEST_CODE_CROP_CAP: //为了适配魅族(奇怪的现象,照相可以使用自定义的路径,相册必须使用系统的Uri) corpCapture(Uri.fromFile(sdcardTempFile)); break;
暂时测试手上的机器都没有问题了,有问题的各位朋友可以回复下,未完待续。。。