android_调用系统相册,相机设置圆形头像

相信我们开发过程中会遇到这样的需求,要求用户拍照,或者从相册中获取,并且把图片设置成圆形.首先说一下思路,得到uri,根据uri来剪切图片,然后得到bitmap,根据bitmap来设置圆形头像。话不多说直接上代码。

private static final int PHOTO_REQUEST_CAMERA = 1;// 拍照
private static final int PHOTO_REQUEST_GALLERY = 2;// 从相册中选择
private static final int PHOTO_REQUEST_CUT = 3;// 结果

private ImageButton people_imagebtn;// ---点击更换头像--

File file;
/* 头像名称 */
private static final String PHOTO_FILE_NAME = "temp_photo.jpg";
private File tempFile;

/*
* 从相册获取
*/
public void gallery(View view) {
// 激活系统图库,选择一张图片
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("image/*");
startActivityForResult(intent, PHOTO_REQUEST_GALLERY);
}


/*
* 从相机获取
*/
public void camera(View view) {
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
// 判断存储卡是否可以用,可用进行存储
if (hasSdcard()) {
intent.putExtra(MediaStore.EXTRA_OUTPUT,
Uri.fromFile(new File(Environment
.getExternalStorageDirectory(), PHOTO_FILE_NAME)));
}
startActivityForResult(intent, PHOTO_REQUEST_CAMERA);
}


protected void onActivityResult(int requestCode, int resultCode, Intent data) {


if (requestCode == PHOTO_REQUEST_GALLERY) {
if (data != null) {
// 得到图片的全路径
Uri uri = data.getData();
// File file = new File(getFilePath_below19(uri));
// tempFile = file;
crop(uri);
}


} else if (requestCode == PHOTO_REQUEST_CAMERA) {
if (hasSdcard()) {
tempFile = new File(Environment.getExternalStorageDirectory(),
PHOTO_FILE_NAME);


crop(Uri.fromFile(tempFile));


} else {
Toast.makeText(PeopleActivity.this, "未找到存储卡,无法存储照片!", 0).show();
}


} else if (requestCode == PHOTO_REQUEST_CUT) {
try {


bitmap = data.getParcelableExtra("data");
if (bitmap != null) {
people_imagebtn.setImageBitmap(toRoundBitmap(bitmap));

}


} catch (Exception e) {
e.printStackTrace();
Toast.makeText(PeopleActivity.this, "未上传图片", 10).show();
}


}


super.onActivityResult(requestCode, resultCode, data);
}


private void crop(Uri uri) {
// 裁剪图片意图
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
intent.putExtra("crop", "true");
// 裁剪框的比例,1:1
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
// 裁剪后输出图片的尺寸大小
intent.putExtra("outputX", 250);
intent.putExtra("outputY", 250);
// 图片格式
intent.putExtra("outputFormat", "JPEG");
intent.putExtra("noFaceDetection", true);// 取消人脸识别
intent.putExtra("return-data", true);// true:不返回uri,false:返回uri
startActivityForResult(intent, PHOTO_REQUEST_CUT);
}


private boolean hasSdcard() {
// --- MEDIA_MOUNTED 存储媒体已经挂载,并且挂载点可读/写。
if (Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
return true;
} else {
return false;
}
}


// ---获取图片的路径---
private String getFilePath_below19(Uri uri) {
// 这里开始的第二部分,获取图片的路径:低版本的是没问题的,但是sdk>19会获取不到
String[] proj = { MediaColumns.DATA };
// 好像是android多媒体数据库的封装接口,具体的看Android文档
Cursor cursor = getContentResolver().query(uri, proj, null, null, null);
// 获得用户选择的图片的索引值
int column_index = cursor.getColumnIndexOrThrow(MediaColumns.DATA);
System.out.println("***************" + column_index);
// 将光标移至开头 ,这个很重要,不小心很容易引起越界
cursor.moveToFirst();
// 最后根据索引值获取图片路径 结果类似:/mnt/sdcard/DCIM/Camera/IMG_20151124_013332.jpg
String path = cursor.getString(column_index);
System.out.println("path:" + path);
return path;
}


// ---这个是bitmap图像转换为圆形---
public Bitmap toRoundBitmap(Bitmap bitmap) {
// 圆形图片宽高
int width = bitmap.getWidth();
int height = bitmap.getHeight();


// 正方形的边长
int r = 0;
// 取最短边做边长
if (width > height) {
r = height;
} else {
r = width;
}
// 构建一个bitmap
Bitmap backgroundBmp = Bitmap.createBitmap(width, height,
Config.ARGB_8888);
// new一个Canvas,在backgroundBmp上画图
Canvas canvas = new Canvas(backgroundBmp);
Paint paint = new Paint();
// 设置边缘光滑,去掉锯齿
paint.setAntiAlias(true);
// 宽高相等,即正方形
RectF rect = new RectF(0, 0, r, r);
// 通过制定的rect画一个圆角矩形,当圆角X轴方向的半径等于Y轴方向的半径时,
// 且都等于r/2时,画出来的圆角矩形就是圆形
canvas.drawRoundRect(rect, r / 2, r / 2, paint);
// 设置当两个图形相交时的模式,SRC_IN为取SRC图形相交的部分,多余的将被去掉
paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
// canvas将bitmap画在backgroundBmp上
canvas.drawBitmap(bitmap, null, rect, paint);
// 返回已经绘画好的backgroundBmp
return backgroundBmp;
}

注意:这里只是拍照,相册获取图片,并且通过uri获取图片路径,最后设置圆形头像的部分代码,布局文件,类就根据自己需求加进入咯.

猜你喜欢

转载自blog.csdn.net/ZyClient/article/details/52527282
今日推荐