欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

相关标签: Android