博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android 设置头像以及裁剪功能
阅读量:7286 次
发布时间:2019-06-30

本文共 8153 字,大约阅读时间需要 27 分钟。

在android的开发过程中,经常遇到设置用户头像以及裁剪图像大小的功能。昨天我遇到了设置用户头像的功能,开始不知道怎么搞,在技术群里问也没人回 答,就研究了微信用户设置头像的功能,了解到用户设置图像的过程,就是两步点击设置头像,选择头像资源的来源,相册和相机两个来得到。

     闲话说的有点多了,来说说技术点吧。其实也比较简单,就是通过Intent来启动相册或者相机就可以了。
看下效果图:

代码如下:

package com.xzw.picture;import java.io.File;import com.xzw.utils.Tools;import android.app.Activity;import android.app.AlertDialog;import android.content.DialogInterface;import android.content.Intent;import android.graphics.Bitmap;import android.graphics.drawable.BitmapDrawable;import android.graphics.drawable.Drawable;import android.net.Uri;import android.os.Bundle;import android.os.Environment;import android.provider.MediaStore;import android.view.View;import android.view.Window;import android.widget.ImageView;import android.widget.RelativeLayout;import android.widget.Toast;/**** @author XuZhiwei (xuzw13@gmail.com)* Create at 2012-8-17 上午10:14:40*/public class MainActivity extends Activity {    /*组件*/        private RelativeLayout switchAvatar;        private ImageView faceImage;        private String[] items = new String[] { "选择本地图片", "拍照" };        /*头像名称*/        private static final String IMAGE_FILE_NAME = "faceImage.jpg";                /* 请求码*/        private static final int IMAGE_REQUEST_CODE = 0;        private static final int CAMERA_REQUEST_CODE = 1;        private static final int RESULT_REQUEST_CODE = 2;        @Override        public void onCreate(Bundle savedInstanceState) {                super.onCreate(savedInstanceState);                requestWindowFeature(Window.FEATURE_NO_TITLE); // 去掉标题                setContentView(R.layout.main);                switchAvatar = (RelativeLayout) findViewById(R.id.switch_face_rl);                faceImage = (ImageView) findViewById(R.id.face);        //设置事件监听                switchAvatar.setOnClickListener(listener);        }           private View.OnClickListener listener = new View.OnClickListener() {                @Override                public void onClick(View v) {                        showDialog();                }        };    /**     * 显示选择对话框     */        private void showDialog() {                               new AlertDialog.Builder(this)                                .setTitle("设置头像")                                .setItems(items, new DialogInterface.OnClickListener() {                                        @Override                                        public void onClick(DialogInterface dialog, int which) {                                                switch (which) {                                                case 0:                                                        Intent intentFromGallery = new Intent();                                                        intentFromGallery.setType("image/*"); // 设置文件类型                                                        intentFromGallery                                                                        .setAction(Intent.ACTION_GET_CONTENT);                                                        startActivityForResult(intentFromGallery,                                                                        IMAGE_REQUEST_CODE);                                                        break;                                                case 1:                                                        Intent intentFromCapture = new Intent(                                                                        MediaStore.ACTION_IMAGE_CAPTURE);                                                        // 判断存储卡是否可以用,可用进行存储                                                        if (Tools.hasSdcard()) {                                                                intentFromCapture.putExtra(                                                                                MediaStore.EXTRA_OUTPUT,                                                                                Uri.fromFile(new File(Environment                                                                                                .getExternalStorageDirectory(),                                                                                                IMAGE_FILE_NAME)));                                                        }                                                        startActivityForResult(intentFromCapture,                                                                        CAMERA_REQUEST_CODE);                                                        break;                                                }                                        }                                })                                .setNegativeButton("取消", new DialogInterface.OnClickListener() {                                        @Override                                        public void onClick(DialogInterface dialog, int which) {                                                dialog.dismiss();                                        }                                }).show();        }           @Override        protected void onActivityResult(int requestCode, int resultCode, Intent data) {                switch (requestCode) {                case IMAGE_REQUEST_CODE:                        startPhotoZoom(data.getData());                        break;                case CAMERA_REQUEST_CODE:                        if (Tools.hasSdcard()) {                                File tempFile = new File(                                                Environment.getExternalStorageDirectory()                                                                + IMAGE_FILE_NAME);                                startPhotoZoom(Uri.fromFile(tempFile));                        } else {                                Toast.makeText(MainActivity.this, "未找到存储卡,无法存储照片!",                                                Toast.LENGTH_LONG).show();                        }                        break;                case RESULT_REQUEST_CODE:                        if (data != null) {                                getImageToView(data);                        }                        break;                }                super.onActivityResult(requestCode, resultCode, data);        }        /**         * 裁剪图片方法实现         *         * @param uri         */        public void startPhotoZoom(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", 320);                intent.putExtra("outputY", 320);                intent.putExtra("return-data", true);                startActivityForResult(intent, 2);        }        /**         * 保存裁剪之后的图片数据         *         * @param picdata         */        private void getImageToView(Intent data) {                Bundle extras = data.getExtras();                if (extras != null) {                        Bitmap photo = extras.getParcelable("data");                        Drawable drawable = new BitmapDrawable(photo);                        faceImage.setImageDrawable(drawable);                }        }}

还有一个工具类:

package com.xzw.utils;import android.os.Environment;/**** @author XuZhiwei (xuzw13@gmail.com)* Create at 2012-8-17 上午10:14:40*/public class Tools {        /**         * 检查是否存在SDCard         * @return         */        public static boolean hasSdcard(){                String state = Environment.getExternalStorageState();                if(state.equals(Environment.MEDIA_MOUNTED)){                        return true;                }else{                        return false;                }        }}

以上就是实现的代码!

      以上代码有个bug,及时你在点击选择图片的过程中,突然间不想设置头像了,点击返回会出现异常
   那是因为你取消的过程中,没有返回任何值,就出现了NullPointEXcetpion的异常,所以我们需要判断一下用户是否取消了操作。
  代码贴出关键代码如下:

//结果码不等于操作取消时候                if (resultCode != RESULT_CANCELED) {                        switch (requestCode) {                                      ..........                        }                }

 

转载地址:http://aspjm.baihongyu.com/

你可能感兴趣的文章
FreeMarker循环变量内建函数
查看>>
Python中time模块详解
查看>>
java 的模板方式设计模式
查看>>
跳转到servlet出现java.lang.InstantiationException:
查看>>
RedHat7 配置VNCServer
查看>>
git 回滚版本
查看>>
Nginx反向代理实现会话(session)保持的两种方式
查看>>
Nginx配置指令location匹配符优先级和安全问题
查看>>
sc create 创建启动服务带参数 目录不能有空格
查看>>
Glusterfs初体验
查看>>
Centos搭建SVN服务器三步曲
查看>>
NC-ERP IUFO系统管理要点
查看>>
linux下将文件设置为swap
查看>>
jquery filter()方法
查看>>
make和makefile
查看>>
eclipse git 强制覆盖本地文件
查看>>
elasticsearch查询关键字slop
查看>>
[Unity3d]Player Settings导出设置
查看>>
Python成长之路第一篇(2)-初识列表和元组
查看>>
Docker EE/Docker CE简介与版本规划
查看>>