android 设置头像以及裁剪功能

来源:互联网 发布:流星网络电视 安卓 编辑:程序博客网 时间:2024/05/22 14:14
在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) {  
                                    ..........
                        }
                }
修复后完整代码:  picture.rar (609.02 KB)
0 0
原创粉丝点击