mu's blog

Work smart. Have fun.

0%

用户头像:拍照、选择和裁剪

一般做 app,只要存在用户系统,跑不了都会有设置用户头像的需求。设置用户头像一般都提供拍照和从相册选择两种方式,得到图片后,让用户对图片进行裁剪,然后上传服务器。

关于拍照和从相册选取,都是向系统发送特定的 Intent,唤起对应的系统程序,然后在onActivityResult 里面,获取我们的图片数据。关于图像裁剪,一般有两种方式,第一种是我们可以直接利用系统提供的裁剪功能,实现图像的裁剪。另外一种是自己处理,比如利用一些第三方的开源项目,如cropperandroid-crop,来完成我们的需求。

以前做过的项目中碰到设置用户头像这个需求,裁剪都是用的上面说到的第一种方式,即通过 Intent intent = new Intent(“com.android.camera.action.CROP”); 语句来调用系统的裁剪功能,但是自从推出 android lollipop(5.0) 之后,用之前的那套代码会有 bug,通过 stackoverflow 了解到因为 “Camera’s crop activity doesn’t return anything for onActivityResult() method. ”。所以这次项目中尝试选择了第二方式来解决这个问题。

1.按设计完成从底部弹出选择对话框

最终完成效果如上

MeInfoActivity.java 中对应的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@OnClick(R.id.rl_set_head)
public void setHeadImage() {
CustomDialog.showSetPicDialog(activity, new CustomDialog.OnDialogTakePic() {
@Override
public void onClick() {// 拍照
actionProfilePic(Constants.IntentExtras.ACTION_CAMERA);
}
}, new CustomDialog.OnDialogSelectPic() {
@Override
public void onClick() {// 本地图片
actionProfilePic(Constants.IntentExtras.ACTION_GALLERY);
}
});
}

2.实现头像的选择(拍照)及裁剪

MeInfoActivity.java 中对应的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
private void actionProfilePic(String action) {
Intent intent = new Intent(this, ImageCropActivity.class);
intent.putExtra("ACTION", action);
intent.putExtra("FROM", "MeInfoActivity");
startActivityForResult(intent, REQUEST_CODE_UPDATE_PIC);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent result) {
if (requestCode == REQUEST_CODE_UPDATE_PIC) {
if (resultCode == RESULT_OK) {
String imagePath = result.getStringExtra(Constants.IntentExtras.IMAGE_PATH);
showCroppedImage(imagePath);
} else if (resultCode == RESULT_CANCELED) {

} else {
String errorMsg = result.getStringExtra(ImageCropActivity.ERROR_MSG);
Toast.makeText(this, errorMsg, Toast.LENGTH_LONG).show();
}
}
}

在 MeInfoActivity.java 中只是按照用户的选择发出相对应的 action,选择、拍照、裁剪的响应都是放到 ImageCropActivity.java 中处理的。
ImageCropActivity.java 中对应的代码我是参见的开源项目,地址

3.将裁剪后的本地图片上传到服务器

通常上传 app 本地文件(如图片)到后台 server,需要 app 开发人员与后台接口人员定义一种方式。