一、问题:想给自己的app设计个换头像操作,网上找了很多,但都有一些毛病,所以自己结合网上一些教程最后成功了,所以记录下。
二、方法:调用系统的相册获取图片后,再调用系统的图片剪辑,之后显示在ImageB。
三、源码解析
1、调用你系统相册
//打开相册
Intent intent1 = new Intent(Intent.ACTION_PICK, null);
intent1.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
startActivityForResult(intent1, 1);
2、用Intent向上一活动返回数据,在onActivityResult
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
// 获取头像
case 1:
if(resultCode==RESULT_OK){
// Uri mImageUri;
mImageUri=data.getData();
//剪辑从系统获得的图片
crop();
}
break;
case 2:
if(resultCode==RESULT_OK){
try {
//从剪辑保存的Uri变成Bitmap。再显示在ImageButton,user_IB是ImageButton
head_icon = BitmapFactory.decodeStream(getContentResolver().openInputStream(mSmallUri));
user_IB.setImageBitmap(head_icon);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
break;
}
}
3、剪辑函数
/由于从相机获取的图片很大,所以要裁剪
private void crop() {
/*新建用于存剪裁后图片的文件,并转化为Uri*/
File imageFile = createImageFile();
//Uri mSmallUri;
mSmallUri = Uri.fromFile(imageFile);
Log.i("sfkj", "crop: " + mSmallUri);
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(mImageUri, "image/*");
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
intent.putExtra("outputX", 200);
intent.putExtra("outputY", 200);
intent.putExtra("scale", true);
intent.putExtra("return-data", false);//设置为不返回缩略图
intent.putExtra(MediaStore.EXTRA_OUTPUT, mSmallUri);//设置大图保存到文件
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());//保存的图片格式
intent.putExtra("noFaceDetection", false);
startActivityForResult(intent, 2);
}
4、创建文件函数
/*用时间创建图片文件,防重名*/
private File createImageFile() {
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
String imageFileName = "JPEG_" + timeStamp + "_";
File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
File imageFile = null;
try {
imageFile = File.createTempFile(imageFileName, ".jpg", storageDir);
} catch (IOException e) {
e.printStackTrace();
}
return imageFile;
}
四、遇到的坑
1、用另一种方面启动相册,失败
Intent intent1 = new Intent(Intent.ACTION_PICK, null);
intent1.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
startActivityForResult(intent1, 1);
2、剪辑后的图片没有用一个新的Uri保存(这样会导致两个Uri相同,导致失败),失败
没有保存的显示ImageButton(失败)
Bundle extras = data.getExtras();
head_icon= extras.getParcelable("data");
user_IB.setImageBitmap(head_icon);
有保存的显示ImageButton(成功)
head_icon = BitmapFactory.decodeStream(getContentResolver().openInputStream(mSmallUri));
user_IB.setImageBitmap(head_icon);
故必须保存在一个新的Uri中
intent.putExtra(MediaStore.EXTRA_OUTPUT, mSmallUri);//设置大图保存到文件