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


可行性分析


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

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

我的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);}@Overrideprotected 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上*/@Overrideprotected 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 blocke.printStackTrace();}finally {if(is!=null) {try {is.close();} catch (IOException e) {// TODO Auto-generated catch blocke.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 blocke.printStackTrace();}finally {if(is!=null) {try {is.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}is = null;}}}

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

总结


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

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

app如何更换用户头像信息呢?不妨这样做相关推荐

  1. Android 更换用户头像(拍照、相册选取)

    Android 更换头像 前言 正文 一.新建项目 二.配置项目 三.布局.样式改动 四.权限请求 五.底部弹窗显示 六.工具类 七.打开相机.相册 八.页面返回显示图片 九.本地缓存 十.后台获取 ...

  2. 小程序 | 获取用户头像信息接口改进:getUserInfo的使用

    开发小程序过程中,发现最近微信官方新调整了getUserInfo的接口的使用,并发布了一篇<小程序登录.用户信息相关接口调整说明>公告,摸索了一番之后,了解到getUserProfile用 ...

  3. 微信小程序-获取用户头像信息以及修改用户头像

    这里主要用到button的open-type功能,官网已有说明: 给button设置open-type="chooseAvatar",来使bindchooseavatar方法生效, ...

  4. C# 项目--更换用户头像,使用相对路径

    软件: Visual Studio 2019 项目类型: C# Windows窗体应用(.NET Framework) 目的: 本地项目,保存用户的头像(图片文件),使用绝对路径,一般不会出现问题.但 ...

  5. Android更换用户头像实现

    使用 BitmapFactory.Options options2 = new BitmapFactory.Options();options2.inPreferredConfig = Bitmap. ...

  6. php 更换用户头像,替换用户头像

    写个上传文件的的表单即可 再写个处理文件的php if ((($_FILES["file"]["type"] == "image/gif") ...

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

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

  8. php设置用户头像,PHP针对多用户实现更换头像功能

    一个网站,其实说白了就是某几个特定功能的组合,而更换用户头像就在这些功能之中.今天就来做个测试,针对不同的用户,实现头像上传功能. 先给大家展示下成品效果图: 思路 针对不同的用户上传头像,我们要为每 ...

  9. 【用户头像】功能实现学习记录

    用户头像 用了差不多三天时间,搞完这个功能,学习记录如下 一.项目结构 前端:vue + element-ui 后端:Springboot 数据库:mysql 二.需求 1.右上角增加[用户中心],可 ...

最新文章

  1. Openresty最佳案例 | 第7篇: 模块开发、OpenResty连接Redis
  2. java简单通讯录的实现02person类_用java实现简单的小游戏(你一定玩过)
  3. python环境搭建_搭建Python编程环境
  4. mysql十分钟分组_MYSQL每隔10分钟进行分组统计的实现方法
  5. 品牌推广前期要进行哪些针对性的步骤?
  6. python range函数范围_Python range函数深入解析
  7. 光流.flo文件生成.png图片(可批量)
  8. 计算机学院辩论队,计算机学院新生辩论赛圆满落幕
  9. 定制Eclipse IDE之功能篇(二)
  10. matlab计算定积分教程,Matlab计算定积分的操作内容讲解
  11. linux系统如何启动rpcbind,rpcbind无法启动的问题【已解决】
  12. tomcat7安装详细过程
  13. 调音台docker教程_超详细Docker实战教程,万字详解!
  14. matlab谢尔宾斯三角_几何画板教程:谢尔宾斯基三角形的制作
  15. IDEA使用教程之创建一个工程(一)
  16. 风影ASP.NET基础教学 4 验证控件
  17. 一心多用多线程-阻塞队列(5)-CountDownLatch
  18. JAVA毕业设计服装连锁店后台管理系统计算机源码+lw文档+系统+调试部署+数据库
  19. rt-thread ------fal移植
  20. 美国地质调查局DEM,需账户密码

热门文章

  1. Scratch五子棋
  2. 学习teardrop攻击并伪造一个ip包
  3. 永善县黄华镇大永高速通车了
  4. 毕设 疲劳驾驶检测系统 python
  5. 关于睡眠检测自定义VIEW
  6. 如何将Word中数据转换为excel表格
  7. Ubuntu18.04美化桌面(主题、图标)
  8. (二)postman批量执行用例
  9. 衰减3dB是什么意思
  10. 可视化行程管理app_可视化流量:时间行程,扭矩和时间图