0

我的帖子

个人中心

设置

  发新话题
在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)

本帖最近评分记录
  • 风泊海上 无忧币 +6 好,不错的分享,常来哈,大家互相学习。 ... 2012-8-18 00:05
  • aiguo1999 无忧币 +5 热心分享 2012-8-17 14:12
  • MarsBobo 无忧币 +5 感谢分享~ 2012-8-17 11:19
  • 邵程程 无忧币 +5 不错的分享~而且一诺千金呀~ 2012-8-17 11:07



本帖最后由 xuzw13 于 2012-8-23 10:07 编辑
不错的文章,感谢楼主的分享~



引用:
原帖由 Arenation 于 2012-8-17 10:52 发表
不错的文章,感谢楼主的分享~
第一次在这边写文字写的有点纠结,感觉这个论坛功能应该更加的强大,不然我上传图片很不好传,不过也值得哈



感谢楼主的分享,解释的很清晰~



不错的文章啊,第一次发帖就这么好,欢迎朋友常来,大家共同交流学习。



引用:
原帖由 xuzw13 于 2012-8-17 10:55 发表

第一次在这边写文字写的有点纠结,感觉这个论坛功能应该更加的强大,不然我上传图片很不好传,不过也值得哈
第一次发帖,那这应该算一鸣惊人了,上传图片遇到什么问题了,有问题可以随时和我们反映,这样我们也会更快的进步和提高!



引用:
原帖由 小_云 于 2012-8-17 15:22 发表


第一次发帖,那这应该算一鸣惊人了,上传图片遇到什么问题了,有问题可以随时和我们反映,这样我们也会更快的进步和提高!
主要是我要插入图片还有去引用地址,我是本地的图片,下面的浏览选择一张图片,而且不能上传,导致我无法添加图片,我选择发布后,才看到图片在下方,然后我还要一张张图片的上传,然后一张张图片的插入,点了有十来次编辑本帖的功能。



我在其他地方也看到过类似的,还分享过来了...
你俩的方法类似,多向你们学习了



提示: 作者被禁止或删除 内容自动屏蔽
这个可以试下,哈哈



感谢楼主的分享,解释的很清晰~



羡慕、嫉妒、佩服



引用:
原帖由 dnswan 于 2012-8-23 11:01 发表
羡慕、嫉妒、佩服
嘿嘿,互相学习,交流经验



LZ,非常感谢您的代码,有几个问题要请教下您。
1.我在使用调用拍照功能时,拍完照之后发现没有调用到裁剪的页面来。
2.我在相册里看照片的文件名时发现文件名不是faceimage.jpg,而是360相机给它命的名。ps我把系统的相机删除了

发现我把上述这段位置的代码改成以下就解决上面的问题。
复制内容到剪贴板
代码:
                                          case CAMERA_REQUEST_CODE:
                     if (Tools.hasSdcard()) {
                             startPhotoZoom(Uri.fromFile(new File(Environment
                                                .getExternalStorageDirectory(),
                                                IMAGE_FILE_NAME)));
                     } else {
                             Toast.makeText(SnokerActivity.this, "未找到存储卡,无法存储照片!",
                                             Toast.LENGTH_LONG).show();
                     }

                     break;



本帖最后由 kingstudio 于 2012-11-14 00:49 编辑
楼主 好人啊 :hug: :hug: :hug:



:lol1 很好很强大:handshake



:loveliness:1 文章很好 值得学习



复制内容到剪贴板
代码:
if (Tools.hasSdcard()) {
                                File tempFile = new File(
                                                Environment.getExternalStorageDirectory() + IMAGE_FILE_NAME);
这个地方写错了,拼接的不是图片的完整路径,少个“/”
复制内容到剪贴板
代码:
if (Tools.hasSdcard()) {
                                File tempFile = new File(
                                                Environment.getExternalStorageDirectory()
                                                                +  "/" + IMAGE_FILE_NAME);



本帖最后由 rongwei84n 于 2013-6-28 13:14 编辑
感谢楼主的分享



楼主可以把源码放给我么?上面的下载不了。。谢谢133900029@qq.com



‹‹ 上一贴:android 怎么判断点击的点是否在bitmap上   |   下一贴:ToolWiz photos保护你不能说的秘密 ››
  发新话题
快速回复主题
关于我们 | 诚聘英才 | 联系我们 | 网站大事 | 友情链接 |意见反馈 | 网站地图
Copyright©2005-2019 51CTO.COM
本论坛言论纯属发布者个人意见,不代表51CTO网站立场!如有疑义,请与管理员联系:bbs@51cto.com