android 设置头像以及裁剪功能

在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 ([email protected])
* 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 ([email protected])
* 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) {
                                    ..........
                        }
                }
时间: 2024-11-09 00:32:45

android 设置头像以及裁剪功能的相关文章

Android设置头像,手机拍照或从本地相册选取图片作为头像

 [Android设置头像,手机拍照或从本地相册选取图片作为头像] 像微信.QQ.微博等社交类的APP,通常都有设置头像的功能,设置头像通常有两种方式: 1,让用户通过选择本地相册之类的图片库中已有的图像,裁剪后作为头像. 2,让用户启动手机的相机拍照,拍完照片后裁剪,然后作为头像. 我现在写一个简单的完整代码例子,说明如何在Android中实现上述两个头像设置功能. MainActivity.java文件: package zhangpgil.photo; import java.io.F

Android实战简易教程-第二十七枪(Android设置头像上传功能实现)

在一般开发中上传图片作为头像的功能非常常见,下面我们研究下具体实现,代码很简单,大家可以直接拿来使用哦! 1.先看一下布局文件,很是丑陋: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent&

移动端 上传头像 并裁剪功能(h5)

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, maximum-scale=1"> <title>移动端头像图片上传裁剪</title>

Android图片裁剪功能——调用系统裁剪

花了两天时间看了下android的图片裁剪功能的实现.其实刚开始做这个我挺虚的,以为整个功能都需要自己写出来,但查了些资料,发现android已经提供了裁剪功能,需要的话自己调用就成了.soga,这下轻松多了. 首先推荐几篇博客 Android大图片裁剪终极解决方案 要想弄明白裁剪功能,这系列博客非常重要,你可以不看我下面总结的,但你一定要看他这系列的几篇文章. Android 图片裁剪功能实现详解(类似QQ自定义头像裁剪) 这篇也不错,比较喜欢他的注释.虽然也有些误导,比如说他有一段对setD

【Android开发经验】设置用户头像并裁剪,仅仅是这么简单?

转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992 在做APP的时候,如果有用户系统功能,那么一般都逃不了这个需求,就是给用户设置头像,而设置头像,又包括从拍照和从相册选取两个方式,而且选择了之后,一般又都会要求对图像进行裁剪,让用户设置头像.今天这篇文章就是介绍如何完成这个需求的. 我们首先分析一下需求.关于拍照和从相册选取,都可以向系统发送特定的Intent,唤起对应的系统程序,然后在onActivityResult里面,获取我们的数据即可.关于图像裁

android之照相、相冊裁剪功能的实现过程

今天无聊做了一些照相.相冊裁剪功能,希望能够帮到大家! 不多说了,贴代码实际一点: 首先是XML: <ImageButton android:id="@+id/imageButton1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/xiaoma" /> <Butt

android 用户头像,图片裁剪,上传并附带用户数据base64code 方式

图片上传的文件流我上一篇博客写了,这一篇我们说一下base64,base64上传方式就是将图片转换成base64码,然后把base64码以字符串的方式上传,然后服务器接收到以后再解码就可以了,相对于文件流来说比较简单: 用户头像上传我们首先要获得图片的url然后再裁剪图片,然后把裁剪后的图片转换成base64然后在上传: 下边是安卓端代码: 首先我们要获得裁剪后的图片:一,选择图片: 代码如下,通过对话框选择获得图片的方式: activity: /* * 提示对话框 */ private voi

jQuery插件ImgAreaSelect 实例讲解一(头像上传预览和裁剪功能)

上一节随笔中,我们已经知道了关于jQuery插件ImgAreaSelect基本的知识:那么现在看一下实例: 首先,要知道我们应该实现什么功能? (1)图片能够实现上传预览功能 (2)拖拽裁剪图片,使其能够显示裁剪后的区域 (3)显示要裁剪区域的坐标 其次,该如何引用该插件呢? 那就具体看一下吧! 第一步:先将样式和文件包引入(根据你自己的位置引入) <!--引入imgareaselect的css样式--> <link rel="stylesheet" type=&qu

用JQuery仿造QQ头像裁剪功能

原文:用JQuery仿造QQ头像裁剪功能 最近工作真心忙碌,几乎没时间写博客.今天趁周末来仿一个QQ头像裁剪功能插件.效果如下: 所有文件都可在我的Github上下载,从头到尾从简到繁按步骤一共分了9个HTML文件,每个步骤文件里的注释都写的很清楚,故在本博客内不赘述. 原理: 主要是通过css的clip来裁剪图片可视区域,拖动剪裁窗口这里使用了JQ-UI的draggable插件(但是缩放没有,贪方便可以使用Resizable插件,但都用插件的话就没有研究的意义了). 缩放功能原理其实很简单,不