只要涉及到用户的功能,基本都会使用到用户头像功能。那么切换用户头像,就是一个必做的功能。切换头像的图片源,一般有两个:一个是拍照然后裁剪图片,另一种是从图库中选择图片,然后裁剪图片。所以这里就来实现这两个功能。
1.拍照
直接贴代码
//打开相机拍照,获取头像
private void toTake(){
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
file = new File(PICTURE_FILE_DIR,
System.currentTimeMillis() + ".jpg");
if (Build.VERSION.SDK_INT >= 24) {
ImgUri = FileProvider.getUriForFile(this, AUTHORITY, file);
} else {
ImgUri = Uri.fromFile(file);
}
intent.putExtra(MediaStore.EXTRA_OUTPUT, ImgUri);
startActivityForResult(intent, TAKE_PICTURE_REQUEST_CODE);
}
TAKE_PICTURE_REQUEST_CODE是一个常量,可以是任何值,用户拍照回调的识别。
注意,打开相机时,需要传uri。如果是Android7.0版本,图片的url就需要使用FileProvider.getUriForFile获取。
2.图库
接下来是打开图库的代码
//打开相册,选择图片
private void openAlbum(){
Intent intent2 = new Intent("android.intent.action.PICK");
intent2.setType("image/*");
startActivityForResult(intent2, ALBUM_REQUEST_CODE);
}
注意,ALBUM_REQUEST_CODE是图库的回调值,不要与拍照的回调值一样。
## 3.裁剪图片
```java
//裁剪图片
public void onPhoto(Uri uri, int outputX, int outputY) {
Intent intent = null;
File saveFile = new File(PICTURE_FILE_DIR+"head.jpg");
if (!saveFile.exists()){
try {
saveFile.createNewFile(); //创建裁剪图片后的保存地址
}catch (IOException e){
e.printStackTrace();
}
}
Uri mUriSave = Uri.fromFile(saveFile); //裁剪图片时,mUriSave是要使用Uri.fromFile(file)生成的,而不是使用FileProvider.getUriForFile。
intent = new Intent("com.android.camera.action.CROP");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //如果安卓7.0版本以上,要加上这句话
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); //否则拍照后裁剪会报,无法加载图片的异常
}
intent.setDataAndType(uri, "image/*");
intent.putExtra("crop", "true");
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
intent.putExtra("outputX", outputX);
intent.putExtra("outputY", outputY);
intent.putExtra("scale", true);
intent.putExtra(MediaStore.EXTRA_OUTPUT, mUriSave); //mUriSave是要使用Uri.fromFile(file)生成的,而不是使用FileProvider.getUriForFile。
intent.putExtra("return-data", true);
intent.putExtra("circleCrop", true);
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
intent.putExtra("noFaceDetection", true); // no face detection
startActivityForResult(intent, TAILOR_REQUEST_CODE);
}
TAILOR_REQUEST_CODE表示裁剪图片的回调值
这里需要注意两个地方:
1.裁剪图片时,mUriSave是要使用Uri.fromFile(file)生成的,而不能使用FileProvider.getUriForFile。否则会出现,“无法保存裁剪后的图片”提示异常
2.如果是Android7.0等高版本,需要添加这句代码,intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
否则会无法加载图片的异常
4.回调
根据程序的回调来执行接下来的方法
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode){
case TAKE_PICTURE_REQUEST_CODE: //拍照回调
if (ImgUri != null) {
onPhoto(ImgUri, 300, 300);
}
break;
case ALBUM_REQUEST_CODE: //图库选择回调
if (data != null) {
Uri uri = data.getData();
onPhoto(uri, 300, 300);
}
break;
case TAILOR_REQUEST_CODE: //图片裁剪后回调
if (data != null) {
Bundle extras = data.getExtras();
Bitmap bitmap = (Bitmap) extras.get("data");
if (bitmap != null) {
accountHeadPortraitImage.setImageBitmap(bitmap);
}
}
break;
}
}
accountHeadPortraitImage为要显示裁剪后图片的ImageView控件。到此,整个程序就完成了。
5.写在最后
加油!
加油!
加油!