Android中直接打开相册选图或直接拍照都很简单,通过指定Intent调用对应页面即可
对图片进行裁剪也可以调用系统CROP对应intent完成
但不少手机都在接收数据时或裁剪过程中多少出点问题,比如onActivityResult中接收不到裁剪后的数据,裁剪页面卡住没反应...
在网上搜集资料整理后,搞了个自认为可以通用的demo,记录一下
拍照或裁剪后可以指定图片存储路径Uri,通过Uri可以获取原尺寸图片,尤其在CROP时如果return-data指定为true,则会返回bitmap对象,小图没问题,当图片很大时就会遇到问题了,所以为了通用,这里就统一使用Uri
布局文件就两个按钮一个ImageView,其中一个按钮用来打开相册选图进行缩放,另外一个用来打开相机,ImageView用来显示裁剪后的图片,xml就不贴了
import java.io.File;
import java.io.FileNotFoundException;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Base64;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import cn.look.R;
/**相机相册选图缩放*/
public class PhotoPickerActivity extends Activity {
private ImageView mIv;
public static final int CAMERA = 1;// 拍照
public static final int ALUM = 2; // 相册
public static final int CROP = 3;// 裁剪结果
private Uri mUriSave;//裁剪后图片保存路径
private Uri mUriCamera;//拍照图片临时存放路径
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_image);
mIv = (ImageView) findViewById(R.id.iv);
mUriSave = Uri.fromFile(new File(Environment.getExternalStorageDirectory(),"temp.jpg"));
mUriCamera = Uri.fromFile(new File(Environment.getExternalStorageDirectory(),"camera.jpg"));
log("URI:"+mUriSave);
}
public void camera(View v) {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, mUriCamera);
startActivityForResult(intent, CAMERA);
}
public void alum(View v) {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT, null);
intent.setType("image/*");
intent.putExtra("crop", "true");
intent.putExtra("aspectX", 2);
intent.putExtra("aspectY", 1);
intent.putExtra("outputX", 600);
intent.putExtra("outputY", 600);
intent.putExtra("scale", true);
intent.putExtra("return-data", false);//截小图这里true,不用设置MediaStore.EXTRA_OUTPUT
intent.putExtra(MediaStore.EXTRA_OUTPUT, mUriSave);
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
intent.putExtra("noFaceDetection", true);
startActivityForResult(intent, ALUM);
}
@Override
protected void onActivityResult(int resquestCode, int resultCode, Intent data) {
log(resquestCode+"[]"+resultCode+"==onActivityResult:"+data);
if (data == null)
return;
switch (resquestCode) {
case CAMERA:// 拍照
startPhotoZoom(mUriCamera);
break;
case ALUM: // 相册
case CROP://裁剪 不管怎么选的图裁剪结果都是同一个文件 直接uri读取好了 省事
log("裁剪结果返回intent.data="+data.getData());
Bitmap bitmap = null;
try {
bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(mUriSave));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
mIv.setImageBitmap(bitmap);
break;
}
super.onActivityResult(resquestCode, resultCode, data);
}
public void startPhotoZoom(Uri uri) {
log("开始缩放uri:"+uri);
cropImageUri(uri, 1000, 1000, CROP);
}
private void cropImageUri(Uri uri, int outputX, int outputY, int requestCode){
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
intent.putExtra("crop", "true");
intent.putExtra("aspectX", 2);//缩放比例
intent.putExtra("aspectY", 1);
intent.putExtra("outputX", outputX);//输出图片大小
intent.putExtra("outputY", outputY);
intent.putExtra("scale", true);//保持比例
intent.putExtra(MediaStore.EXTRA_OUTPUT, mUriSave);//裁剪结果存放路径
intent.putExtra("return-data", false);//是否返回bitmap
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
intent.putExtra("noFaceDetection", true); // no face detection
startActivityForResult(intent, requestCode);
}
private void log(String s) {
Log.e("---look---", s == null ? "NULL" : s);
}
}