android之换头像及遇到的一些坑
程序员文章站
2022-03-19 18:09:37
一、问题:想给自己的app设计个换头像操作,网上找了很多,但都有一些毛病,所以自己结合网上一些教程最后成功了,所以记录下。二、方法:调用系统的相册获取图片后,再调用系统的图片剪辑,之后显示在ImageB。三、源码解析1、调用你系统相册 //打开相册 Intent intent1 = new Intent(Intent.ACTION_PICK, null); intent1.setDataAndType(Me...
一、问题:想给自己的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);//设置大图保存到文件
本文地址:https://blog.csdn.net/qq_42757083/article/details/107576275
上一篇: 阿尔麦斯机器人基地RMaaS正式启动 打造国内一流的机器人园区
下一篇: Service的简单使用
推荐阅读
-
Android图像处理之绘制圆形、三角形及扇形的头像
-
详解Android Studio3.5及使用AndroidX的一些坑
-
Android Studio 3.x版本 的输入法遇到的坑及解决方案
-
Android图像处理之绘制圆形、三角形及扇形的头像
-
Android开发之StackView用法和遇到的坑分析
-
Android之把app作为独立的module导入其他项目遇到的坑
-
uniapp踩坑(四):android中引入高德地图,实时定位(精度)遇到的问题及解决方法
-
详解Android Studio3.5及使用AndroidX的一些坑
-
Android Studio3.5及使用AndroidX的一些坑
-
Android 7.1 ShortcutManager(应用快捷方式)的超简单使用及一些可能遇到的BUG