android之换头像及遇到的一些坑

一、问题:想给自己的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);//设置大图保存到文件

你可能感兴趣的:(Android)