下面是针对于7.0及以上的系统,对于7.0系统谷歌官方对于文件的访问权限做了更为严格的要求,需要使用FileProvider,Android的从 N 开始不允许以file://的方式通过Intent在两个App之间分享文件,的取而代之的英文通过FileProvider生成content://Uri 。如果在Android N 以上的版本继续使用file://方式分享文件,则系统会直接抛出异常,导致App出现 Crash,使用系统自带的intent来实现拍照,相册选择图片后剪切功能时,会遇到返回崩溃的问题。关于FileProvider网上示例很多,也可以参考官方文档原因是设置如下属性时,intent.putExtra("return-data", true); 通过Intent中的data来传递,当数据过大,即超过1M(经测试,这个数值在不同手机还不一样)时就崩了!!!!
imageCropUri = getUri();
private Uri getUri() {
File tmpDir = new File(Environment.getExternalStorageDirectory() + "/image/");
if (!tmpDir.exists()) {
tmpDir.mkdirs();
}
File img = new File(tmpDir.getAbsolutePath() + "/pic.jpeg");
if (img.exists()) {
img.delete();
}
return Uri.fromFile(img);
}
Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
startActivityForResult(intent, GALLERY_REQUEST_CODE);
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == GALLERY_REQUEST_CODE && resultCode == RESULT_OK) {
if (data == null) {//相册
return;
}
Uri urifile = data.getData();
// Uri curi = convertUri(urifile);
// startImageZoom(curi);
startImageZoom(urifile);
}else if (requestCode == CROP_REQUEST_CODE && resultCode == RESULT_OK) {
if (data == null) {
return;
}
// //剪裁后的图片
// Bundle extras = data.getExtras();
// if (extras == null) {
// return;
// }
// Bitmap bm = extras.getParcelable("data");
// Uri uri = saveBitmap(bm);
// setImageToView(data);
onStarted();
//调用接口
presenter.modifyAvatar(imageCropUri.getEncodedPath(), “接口地址”);
}
}
/**
* 剪裁图片
* @param uri
*/
private void startImageZoom(Uri uri) {
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
intent.putExtra("crop", "true");
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
intent.putExtra("outputX", 300);
intent.putExtra("outputY", 300);
intent.putExtra("scale", true);
intent.putExtra("return-data", false);
intent.putExtra("noFaceDetection",true);
//裁剪之后,保存在裁剪文件中,关键
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageCropUri);
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
startActivityForResult(intent, CROP_REQUEST_CODE);
}
imageCropUri = getUri();
private Uri getUri() {
File tmpDir = new File(Environment.getExternalStorageDirectory() + "/image/");
if (!tmpDir.exists()) {
tmpDir.mkdirs();
}
File img = new File(tmpDir.getAbsolutePath() + "/pic.jpeg");
if (img.exists()) {
img.delete();
}
return Uri.fromFile(img);
}
Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
startActivityForResult(intent, GALLERY_REQUEST_CODE);
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == GALLERY_REQUEST_CODE && resultCode == RESULT_OK) {
if (data == null) {//相册
return;
}
Uri urifile = data.getData();
// Uri curi = convertUri(urifile);
// startImageZoom(curi);
startImageZoom(urifile);
}else if (requestCode == CROP_REQUEST_CODE && resultCode == RESULT_OK) {
if (data == null) {
return;
}
// //剪裁后的图片
// Bundle extras = data.getExtras();
// if (extras == null) {
// return;
// }
// Bitmap bm = extras.getParcelable("data");
// Uri uri = saveBitmap(bm);
// setImageToView(data);
onStarted();
//调用接口
presenter.modifyAvatar(imageCropUri.getEncodedPath(), “接口地址”);
}
}
/**
* 剪裁图片
* @param uri
*/
private void startImageZoom(Uri uri) {
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
intent.putExtra("crop", "true");
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
intent.putExtra("outputX", 300);
intent.putExtra("outputY", 300);
intent.putExtra("scale", true);
intent.putExtra("return-data", false);
intent.putExtra("noFaceDetection",true);
//裁剪之后,保存在裁剪文件中,关键
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageCropUri);
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
startActivityForResult(intent, CROP_REQUEST_CODE);
}