一般做 app,只要存在用户系统,跑不了都会有设置用户头像的需求。设置用户头像一般都提供拍照和从相册选择两种方式,得到图片后,让用户对图片进行裁剪,然后上传服务器。
关于拍照和从相册选取,都是向系统发送特定的 Intent,唤起对应的系统程序,然后在onActivityResult 里面,获取我们的图片数据。关于图像裁剪,一般有两种方式,第一种是我们可以直接利用系统提供的裁剪功能,实现图像的裁剪。另外一种是自己处理,比如利用一些第三方的开源项目,如cropper 和 android-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 开发人员与后台接口人员定义一种方式。