1. 程式人生 > >android照相、相簿獲取圖片剪裁部分手機異常的解決方法

android照相、相簿獲取圖片剪裁部分手機異常的解決方法

解決辦法

可以定義一個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

為了方便大家我吧onActivityResult類貼出來吧
@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;
		}

	}