android照相、相簿獲取圖片剪裁部分手機異常的解決方法
阿新 • • 發佈:2019-01-04
解決辦法
可以定義一個Uri物件來儲存剪下後的圖片
File file = new File(Environment.getExternalStorageDirectory(),BitmapUtil.generateFileName());
corpUri = Uri.fromFile(file);
開啟相機:
/** * 開啟照相機 */ private void openCamera() { String SDState = Environment.getExternalStorageState(); if(SDState.equals(Environment.MEDIA_MOUNTED)){ Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);// action is ContentValues values = new ContentValues(); imageUri = this.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, imageUri); startActivityForResult(intent, REQUEST_CODE_CAMARE); }else{ ToastUtil.showShort(mActivity, "SD卡不存在"); } }
開啟相簿:
/**
* 開啟相簿
*/
private void openPhoto() {
Intent intent = new Intent(Intent.ACTION_PICK, null);
intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,"image/*");
startActivityForResult(intent, REQUEST_CODE_PHOTO);
}
呼叫系統裁剪:
private void cropImageUri() { Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(imageUri, "image/*"); // 下面這個crop=true是設定在開啟的Intent中設定顯示的VIEW可裁剪 intent.putExtra("crop", "true"); intent.putExtra("scale", true);// 去黑邊 intent.putExtra("scaleUpIfNeeded", true);// 去黑邊 // aspectX aspectY 是寬高的比例 intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); intent.putExtra("outputX", imageSize); intent.putExtra("outputY", imageSize); intent.putExtra("return-data", false);////設定為不返回資料 intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString()); intent.putExtra("noFaceDetection", true); intent.putExtra(MediaStore.EXTRA_OUTPUT, corpUri); intent.putExtra("scale", true); startActivityForResult(intent, REQUEST_CODE_CROP); }
在很多部落格中都把“return-data”設定為了true然後在onActivityResult中通過data.getParcelableExtra("data")來獲取資料,不過這樣的話imageSize這個變數的值就不能太大了,不然你的程式就掛了。這裡也就是我遇到問題的地方了,在大多數高配手機上這樣用是沒有問題的,不過很多低配手機就有點hold不住了,直接就異常了,包括我們的國產神機米3也沒能hold住,所以我建議大家不要通過return data 大資料,小資料還是沒有問題的,說以我們在剪下圖片的時候就儘量使用Uri這個東東來幫助我們。
下面是我們進行剪裁用到的一些引數
Exta Options Table for image/* crop:
SetExtra | DataType | Description |
crop | String | Signals the crop feature |
aspectX | int | Aspect Ratio |
aspectY | int | Aspect Ratio |
outputX | int | width of output created from this Intent |
outputY | int | width of output created from this Intent |
scale | boolean | should it scale |
return-data | boolean | Return the bitmap with Action=inline-data by using the data |
data | Parcelable | Bitmap to process, you may provide it a bitmap (not tested) |
circleCrop | String | if this string is not null, it will provide some circular cr |
MediaStore.EXTRA_OUTPUT ("output") | URI |
Set this URi to a File:///, see example code |
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case REQUEST_CODE_CROP:
changeHead();
break;
case REQUEST_CODE_PHOTO:
if (data != null) {
imageUri= data.getData();
cropImageUri();
}
break;
case REQUEST_CODE_CAMARE:
cropImageUri();
break;
default:
break;
}
}