Android调用系统相册或拍照实现头像更换

Android调用系统相册或拍照实现头像更换

更换头像功能相信每个app,都会用到,这里我也做下总结,记录下。

我这里是将代码从项目中抽取出来,难免可能会涉及到mvp相关的名词,谅解。

1、展示更改头像选择对话框:
@Override
public void showModifyHeadIconDialog() {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    final AlertDialog dialog = builder.create();
    //加载对话框布局
    View view = View.inflate(this, R.layout.personal_modifyhead_dialog, null);
    dialog.setView(view, 0, 0, 0, 0);// 设置边距为0,保证在2.x的版本上运行没问题
    dialog.show();
    //AutoRelativeLayout为鸿洋的百分比布局
    AutoRelativeLayout rl_photograph = (AutoRelativeLayout) view.findViewById(R.id.rl_photograph);
    rl_photograph.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //选择从相册
            presenter.modiftHeadFromPhotograph();
            dialog.dismiss();
        }
    });

    AutoRelativeLayout rl_album = (AutoRelativeLayout) view.findViewById(R.id.rl_album);
    rl_album.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //选择从相机
            presenter.modifyHeadFromAlbum();
            dialog.dismiss();
        }
    });
}
2、两种方式:
private static String path = "/sdcard/myHead/";//sd路径
private Bitmap head;//头像Bitmap

@Override
public void modifyheadFromPhotograph() {
    Intent intent2 = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    //头像文件名称 head.jpg
    intent2.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(Environment.getExternalStorageDirectory(),"head.jpg")));
    startActivityForResult(intent2, 2);//采用ForResult打开
}

@Override
public void modifyheadFromAlbum() {
    Intent intent1 = new Intent(Intent.ACTION_PICK, null);
    intent1.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
    startActivityForResult(intent1, 1);
}
3、根据requestCode分别处理
    //处理返回的resquestCode
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (requestCode) {
        case 1:
            if (resultCode == RESULT_OK) {
                cropPhoto(data.getData());//裁剪图片
            }
            break;
        case 2:
            if (resultCode == RESULT_OK) {
                File temp = new File(Environment.getExternalStorageDirectory()
                        + "/head.jpg");
                cropPhoto(Uri.fromFile(temp));//裁剪图片
            }
            break;
        case 3:
            if (data != null) {
                Bundle extras = data.getExtras();
                head = extras.getParcelable("data");
                if (head != null) {
                    /**
                     * 上传服务器代码
                     */
                    setPicToView(head);//保存在SD卡中
                    cv_headportrait.setImageBitmap(head);//用ImageView显示出来
                }
            }
            break;
        default:
            break;

    }
    super.onActivityResult(requestCode, resultCode, data);
}   
4、其他对应方法
/**
 * 调用系统的裁剪
 *
 * @param uri
 */
public void cropPhoto(Uri uri) {
    Intent intent = new Intent("com.android.camera.action.CROP");
    intent.setDataAndType(uri, "image/*");
    intent.putExtra("crop", "true");
    // aspectX aspectY 是宽高的比例
    intent.putExtra("aspectX", 1);
    intent.putExtra("aspectY", 1);
    // outputX outputY 是裁剪图片宽高
    intent.putExtra("outputX", 150);
    intent.putExtra("outputY", 150);
    intent.putExtra("return-data", true);
    startActivityForResult(intent, 3);
}

private void setPicToView(Bitmap mBitmap) {
    String sdStatus = Environment.getExternalStorageState();
    if (!sdStatus.equals(Environment.MEDIA_MOUNTED)) { // 检测sd是否可用
        return;
    }
    FileOutputStream b = null;
    File file = new File(path);
    file.mkdirs();// 创建文件夹
    String fileName = path + "head.jpg";//图片名字
    try {
        b = new FileOutputStream(fileName);
        mBitmap.compress(Bitmap.CompressFormat.JPEG, 100, b);// 把数据写入文件

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } finally {
        try {
            //关闭流
            b.flush();
            b.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

完结。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值