这篇博客的目的不是为了拿到最后那个Bitmap,而是拿到图片的路径。因为每个项目的需求不尽相同,获取到了路径就可以进行按比例缩放显示、上传等等操作。
原本以下代码都在同一个类,为了方便新手阅读,我按功能区分出来。Demo我就不上传了,下面代码粘贴后用一个Button加一个ImageView就搞定了。
前言:我们先添加权限
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
一、从相册获取图片
//图库请求码
private static final int REQUESTCODE_ALBUM = 1001;
//图片地址
private String photoPath = null;
/* 从相册中获取照片 */
private void getPictureFromAlbum() {
Intent openphotoIntent = new Intent(Intent.ACTION_PICK,
MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(openphotoIntent, REQUESTCODE_ALBUM);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode != RESULT_OK) {
return;
}
switch (requestCode) {
case REQUESTCODE_ALBUM:
//获取图片路径
Uri selectedImage = data.getData();
String[] filePathColumns = {MediaStore.Images.Media.DATA};
Cursor c = getContentResolver().query(selectedImage, filePathColumns, null, null, null);
c.moveToFirst();
int columnIndex = c.getColumnIndex(filePathColumns[0]);
photoPath = c.getString(columnIndex);
c.close();
//根据路径加载图片
Bitmap bm = BitmapFactory.decodeFile(photoPath);
mImage.setImageBitmap(bm);
break;
}
}
二、调用相机拍摄照片(第一种方法:获取Bitmap,是缩略图)
//相机请求码
private static final int REQUESTCODE_CAMERA = 1002;
/* 从相机中获取照片 */
private void getPictureFromCamera() {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, REQUESTCODE_CAMERA);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode != RESULT_OK) {
return;
}
switch (requestCode) {
case REQUESTCODE_CAMERA:
Bundle bundle = data.getExtras();
Bitmap bitmap = (Bitmap) bundle.get("data");
mImage.setImageBitmap(bitmap);
break;
}
}
三、调用相机拍摄照片(第二种方法:设置路径,根据路径获取缩略图)
//相机请求码
private static final int REQUESTCODE_CAMERA = 1002;
//图片地址
private String photoPath = null;
/* 从相机中获取照片 */
private void getPictureFromCamera() {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
//存放图片的文件夹,如果不存在,就创建
String dir = Environment.getExternalStorageDirectory().toString() + "/DCIM/Camera/";
File file = new File(dir);
if (!file.exists()) {
file.mkdirs();
}
//返回照片的全路径名
photoPath = dir + System.currentTimeMillis() + ".jpg";
File photo = new File(file, photoPath);
Uri imageUri = Uri.fromFile(photo);
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(intent, REQUESTCODE_CAMERA);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode != RESULT_OK) {
return;
}
switch (requestCode) {
case REQUESTCODE_CAMERA:
//photoPath就是路径,可以通过路径获取bitmap
Bitmap bm = BitmapFactory.decodeFile(photoPath);
mImage.setImageBitmap(bm);
break;
}
}
我们实验后发现,以上代码展示的图片不是太大就是太小。
所以如果以上代码满足不了需求,就要在onActivityResult方法获取到图片地址时,对图片进行相应的处理,比如按比例缩放等。
如果对系统自带裁剪感兴趣也可以在第三种情况的onActivityResult方法调用以下代码,传入getPictureFromCamera方法中的imageUri。可以打开系统自带的剪裁页面,但此方法设置的参数不一定有效,而且很多机型是有问题的。
private void cropPhoto(Uri uri) {
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", 200); // 宽高
intent.putExtra("outputY", 300);
intent.putExtra("scale", true); //缩放,不会显示黑边
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
intent.putExtra("return-data", true);
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
intent.putExtra("noFaceDetection", true);
startActivityForResult(intent, REQUESTCODE_CROP);
}