5分钟实现Android中更换头像功能


  • 5分钟实现Android中更换头像功能

    写在前面:
    更换头像这个功能在用户界面几乎是100%出现的。通过拍摄照片或者调用图库中的图片,并且进行剪裁,来进行头像的设置。
    功能相关截图如下:

    下面我们直接看看完整代码吧:

                
                
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
                
                
    public class UserActivity extends BaseActivity implements OnClickListener {
    private ImageView iv_photo;
    private Bitmap head;// 头像Bitmap
    private static String path = "/sdcard/myHead/";// sd路径
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    initView();
    initListener();
    }
    private void initView() {
    setContentView(R.layout.activity_user);
    iv_photo = (ImageView) findViewById(R.id.iv_photo);
    Bitmap bt = BitmapFactory.decodeFile(path + "head.jpg");// 从SD卡中找头像,转换成Bitmap
    if (bt != null) {
    @SuppressWarnings("deprecation")
    Drawable drawable = new BitmapDrawable(bt);// 转换成drawable
    iv_photo.setImageDrawable(drawable);
    } else {
    /**
    * 如果SD里面没有则需要从服务器取头像,取回来的头像再保存在SD中
    *
    */
    }
    }
    private void initListener() {
    iv_photo.setOnClickListener(this);
    }
    @Override
    public void onClick(View v) {
    switch (v.getId()) {
    case R.id.iv_photo:// 更换头像
    showTypeDialog();
    break;
    }
    }
    private void showTypeDialog() {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    final AlertDialog dialog = builder.create();
    View view = View.inflate(this, R.layout.dialog_select_photo, null);
    TextView tv_select_gallery = (TextView) view.findViewById(R.id.tv_select_gallery);
    TextView tv_select_camera = (TextView) view.findViewById(R.id.tv_select_camera);
    tv_select_gallery.setOnClickListener(new OnClickListener() {// 在相册中选取
    @Override
    public void onClick(View v) {
    Intent intent1 = new Intent(Intent.ACTION_PICK, null);
    intent1.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
    startActivityForResult(intent1, 1);
    dialog.dismiss();
    }
    });
    tv_select_camera.setOnClickListener(new OnClickListener() {// 调用照相机
    @Override
    public void onClick(View v) {
    Intent intent2 = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    intent2.putExtra(MediaStore.EXTRA_OUTPUT,
    Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "head.jpg")));
    startActivityForResult(intent2, 2);// 采用ForResult打开
    dialog.dismiss();
    }
    });
    dialog.setView(view);
    dialog.show();
    }
    @Override
    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卡中
    iv_photo.setImageBitmap(head);// 用ImageView显示出来
    }
    }
    break;
    default:
    break;
    }
    super.onActivityResult(requestCode, resultCode, data);
    }
    /**
    * 调用系统的裁剪功能
    *
    * @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();
    }
    }
    }
    }

    再添加以下权限

                
                
    1
    2
    3
    4
                
                
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
    <uses-permission android:name="android.permission.INTERNET" />

    Dialog的xml文件如下:

                
                
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
                
                
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <TextView
    android:id="@+id/tv_select_gallery"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center_horizontal"
    android:padding="20dp"
    android:text="从图库中选取"
    android:textColor="#000"
    android:textSize="20sp" />
    <View
    android:layout_width="match_parent"
    android:layout_height="1dp"
    android:layout_marginLeft="10dp"
    android:layout_marginRight="10dp"
    android:background="#000" />
    <TextView
    android:id="@+id/tv_select_camera"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center_horizontal"
    android:padding="20dp"
    android:text="拍摄照片"
    android:textColor="#000"
    android:textSize="20sp" />
    </LinearLayout>
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值