对于现在的手机应用而言,要想获得更多的人的使用,就需要给用户更多的自由功能才行,这也是基于用户体验开发软件的核心思想,一切以用户为中心,想用户之所想,做用户之所需。今天我就来谈一谈刚学到的一个关于设置用户头像的小技巧。


可行性分析


要想实现设置自定义的头像功能,我们通常来说会有两种选择,那就是拍照或者从手机图库里面获取。今天就来讲一讲,这两种方式实现的细节的地方。

  • 首先是拍照实现:原理上将,最简单的实现就是调用系统自带的照相机。这样最为省事嘛。当然了,您也可以通过使用自己开发的一个照相应用来实现这一功能(可以参考我之前的这篇文章做自己的安卓拍照应用,其实很简单)。但是这里并不建议您这样做,毕竟重复造轮子是没有任何意义的嘛,更何况自己实现的应用还不一定有人家系统自带的好使呢。
  • 然后是从本地的图库中选取一张图片来作为结果使用。这样最为方便,因为大部分的用户会使用图库中的图片滴。但是这种方式灵活性较差,因为用户很有可能只想上传自己的自拍照片。这样的话,我们就需要实现上面的那个功能了。

我的Demo


首先是布局文件,这里仅仅是两个按钮(分别用于实现上面的两种方式),和一个用于显示图层的ImageView。仅此而已。所以就不在此列出代码了。

然后是Java代码,这里就贴出来吧,方便大家浏览。

package com.example.intenttest;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

import android.app.Activity;
import android.content.ContentResolver;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

public class MainActivity extends Activity {

    private Button btn_capture;
    private Button btn_getPicture;
    private ImageView imageView;

    public void init() {
        btn_capture = (Button) findViewById(R.id.btn_capture);
        btn_getPicture = (Button) findViewById(R.id.btn_choose);
        imageView = (ImageView) findViewById(R.id.imageview);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();
    }

    /**
     * 调用系统的拍照
     * @param view
     */
    public void beginCapture(View view) {
        Intent intent = new Intent(
                android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
        startActivityForResult(intent, 1001);
    }

    /**
     * 从手机的本地图库中选择一张图片作为头像资源
     * @param view
     */
    public void getPicture(View view) {
        Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
        intent.setType("image/*");
        intent.putExtra("crop", true);
        intent.putExtra("return-data", true);
        startActivityForResult(intent, 1002);
    }

    /**
     * 将上面的Intent中的返回的结果分别显示到相关的ImageView上
     */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        //调用系统相机,获得照片资源,选要注意的是这里的data 是存在于内存中的
        if (requestCode == 1001 && resultCode == RESULT_OK) {
            Bundle bundle = data.getExtras();
            Bitmap bitmap = (Bitmap) bundle.get("data");
            imageView.setImageBitmap(bitmap);

        }
        //使用图库资源,以ContentProvider的方式来实现
        if (requestCode == 1002 && resultCode == RESULT_OK) {
            InputStream is = null;
            try {
                Uri uri = data.getData();
                ContentResolver resolver = getContentResolver();
                is = resolver.openInputStream(uri);
                Bitmap bitmap = BitmapFactory.decodeStream(is);
                imageView.setImageBitmap(bitmap);
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }finally {
                if(is!=null) {
                    try {
                        is.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    is = null;
                }
            }

        }
    }
}

代码实现原理详解


首先是第一种方式,我们可以看到如下核心代码:

Intent intent = new Intent(
                android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
        startActivityForResult(intent, 1001);

以及:

//调用系统相机,获得照片资源,选要注意的是这里的data 是存在于内存中的
        if (requestCode == 1001 && resultCode == RESULT_OK) {
            Bundle bundle = data.getExtras();
            Bitmap bitmap = (Bitmap) bundle.get("data");
            imageView.setImageBitmap(bitmap);

        }

这样做的核心就在于那个Intent了,其指定了是从android.provider.MediaStore.ACTION_IMAGE_CAPTURE,这样就可以在onActivityResult方法中将处理的结果通过转换成一个位图的方式设置到ImageView上,实现用户头像设置。


然后是第二种方式,

/**
     * 从手机的本地图库中选择一张图片作为头像资源
     * @param view
     */
    public void getPicture(View view) {
        Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
        intent.setType("image/*");
        intent.putExtra("crop", true);
        intent.putExtra("return-data", true);
        startActivityForResult(intent, 1002);
    }
//使用图库资源,以ContentProvider的方式来实现
        if (requestCode == 1002 && resultCode == RESULT_OK) {
            InputStream is = null;
            try {
                Uri uri = data.getData();
                ContentResolver resolver = getContentResolver();
                is = resolver.openInputStream(uri);
                Bitmap bitmap = BitmapFactory.decodeStream(is);
                imageView.setImageBitmap(bitmap);
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }finally {
                if(is!=null) {
                    try {
                        is.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    is = null;
                }
            }

        }

这里是借助于ContentProvider,来获取共享的资源。借助于getContentProvider()方法,然后得到一个目标图片的输入流,转换成位图,最后设置到我们的ImageView上,这样同样可以实现我们的头像设置功能。

总结


今天的这个小技巧,虽然很简单,但是实用性还是很高的。我们在日常的额开发过程中遇到的额可能不是简单的直接在本地实现头像的额更换,但是我们可以再一个Service中来实现上传的功能,借助于流的形式,原理上市相似的。

对于代码,如果您发现了一些问题,欢迎批评指正。

app如何更换用户头像信息呢?不妨这样做的更多相关文章

  1. 【Mac电脑新手技巧】苹果电脑如何更换用户头像?

    想给Mac电脑换一个喜欢的用户头像?苹果电脑的用户头像如何更换? 对于很多Mac小白来说,给自己的Mac换一个可心的用户头像很是必要.但是,大多数Mac新手都觉得无从下手!如果你也想给自己的Mac换一 ...

  2. 微信小程序--更换用户头像/上传用户头像/更新用户头像

    changeAvatar:function (){ var that=this; wx.chooseImage({ count: 1, // 默认9 sizeType: ['original', 'c ...

  3. App里面如何正确显示用户头像

    1.说明,一般用户头像在上传的时候都会处理为正方形,如果没有处理该怎么正确显示用户头像呢?解决方案:用css强制 在线地址移动端:戳这里 <div class="main-meimg& ...

  4. 【SVN/Visual Studio】清除/更换AnkhSVN的用户登录信息

    问题: 在VS开发环境下,使用SVN做版本控制,用了TortoiseSVN和插件AnkhSVN.提交代码到SVN服务器时,发现用的是别人的SVN帐号,不是自己的号(比如该电脑之前是别人在使用).想要清 ...

  5. android开发——用户头像

    最近,小灵狐得知了一种能够加快修炼速度的绝世秘法,那便是修炼android神功.小灵狐打算用android神功做一个app,今天他的修炼内容就是头像功能.可是小灵狐是个android小白啊,所以修炼过 ...

  6. 05 . Go+Vue开发一个线上外卖应用(Session集成及修改用户头像到Fastdfs)

    用户头像上传 功能介绍 在用户中心中,允许用户更换自己的头像.因此,我们开发上传一张图片到服务器,并保存成为用户的头像. 接口解析 在用户模块的控制器MemberController中,解析头像上传的 ...

  7. 黑马在线教育项目---34-37、webuploader实现用户头像的异步上传

    黑马在线教育项目---34-37.webuploader实现用户头像的异步上传 一.总结 一句话总结: 启迪:可以多看学习视频,在看电影看电视的时候看的确是不错的选择 1.关于软件的发行版本? 第1阶 ...

  8. jeesite中重启项目时用户头像丢失的疑惑

    jeesite中重启项目时用户头像丢失 使用的时候发现,在更换完头像以后,进行页面的刷新会将头像同步给各个位置,但是在系统重新载入的时候,会出现用户的头像加载不出来的情况,还是以demo为例 可以看到 ...

  9. .NET跨平台之旅:ASP.NET Core从传统ASP.NET的Cookie中读取用户登录信息

    在解决了asp.net core中访问memcached缓存的问题后,我们开始大踏步地向.net core进军——将更多站点向asp.net core迁移,在迁移涉及获取用户登录信息的站点时,我们遇到 ...

随机推荐

  1. [BZOJ]1017 魔兽地图DotR(JSOI2008)

    BZOJ第一页做着做着就能碰到毒题,做到BZOJ1082小C就忍了,没想到下一题就是这种东西.这种题目不拖出来枭首示众怎么对得起小C流逝的青春啊. Description DotR (Defense ...

  2. [bzoj4815]: [Cqoi2017]小Q的表格

    来自FallDream的博客,未经允许,请勿转载,谢谢. 小Q是个程序员. 作为一个年轻的程序员,小Q总是被老C欺负,老C经常把一些麻烦的任务交给小Q来处理.每当小Q不知道如何解决时,就只好向你求助. ...

  3. [NOI2012]

    来自FallDream的博客,未经允许,请勿转载,谢谢. 一天一套noi 简直了.... 昨天勉强做完了noi2011 今天教练又丢出来一套noi2012  去掉提答还有5题 勉强做了3题  先占个坑 ...

  4. 笔记5 bean的作用域

    1. Spring定义了多种作用域,可以基于这些作用域创建bean,包括: 单例(Singleton):在整个应用中,只创建bean的一个实例.(默认) 原型(Prototype):每次注入或者通过S ...

  5. 安装win7提示“我们无法创建新的分区,也找不到现有分区”

    用U盘安装操作系统,但是遇到了这种问题. 来来回删掉主分区,重新建立主分区,都不能搞定.最后还是用古老的方法安装了.安装的方法如下: 大家首先要进入到winpe,这里我用的是大白菜winpe. 将C盘 ...

  6. vmware虚拟机CentOS7安装oracle数据库

    想用linux虚拟机装一个oracle,中间遇到的坑太多了,最后总算是安装好了,一定要写个全面的教程出来. 话不多说 通用编辑命令: vi test.txt   #进入编辑模式 编辑完成后按ESC退出 ...

  7. WPF ListBox 获取listBoxItem

    1.已知item的DataContext,获取ListBoxItem 1)ItemContainerGenerator.ContainerFromItem var selectedItem = Doc ...

  8. Linux——makefile编写

    以前对makefile的编写,限于刚开始接触,我都比较局限一些死板的格式,有时候就会显得有些繁琐.在进一步了解一些系统编译和链接的知识后,对makefile编写流程有了一些新的认识,所以来此梳理梳理, ...

  9. JSP运行过程 JSP脚本 静态动态包含 jsp指令 jsp内置对象jsp四大作用域 jsp动作元素 EL表达式 JSTL 设计模式 JSP开发模式 EL内置对象

    Day38 JSP JSP的运行过程具体如下: (1)客户端发出请求,请求访问JSP文件. (2)JSP容器先将JSP文件转换成一个Java源文件(Java Servlet源程序),在转换过程中,如果 ...

  10. JS实现2048代码

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...