目前几乎所有的APP在用户注册时都会有设置头像的需求,大致分为三种情况:

(1)通过获取本地相册的图片,经过裁剪后作为头像。

(2)通过启动手机相机,现拍图片然后裁剪作为头像。

(3)在APP中添加一些自带的头像资源,供用户选择(不够人性化,目前很少使用)。

这次我们简单介绍下通过获取本地相册以及相机拍摄的方法设置头像,实现思路如下:

(1)通过startActivityForResult方法,分别传递调用系统相册的Intent和调用相机拍照的Intent来做选择

(2)调用Android系统中自带的图片剪裁,实现图片的剪裁并在onActivityResult方法中获取数据。

关于如何处理Activity的返回结果,请参照往期博文《Android中Activity处理返回结果的实现方式》。

本次演示效果如下(分别为从本地相册获取以及从相机拍摄获取头像):

简单布局文件这里不再做赘述,本次试验使用隐式intent调用相机以及本地相册,未在配置清单上添加权限,依然可以调用。java实现代码如下:

import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;
import java.io.File;public class MainActivity extends AppCompatActivity implements View.OnClickListener {private Button buttonLocal, buttonCamera;private ImageView imageView;//相机拍摄的头像文件(本次演示存放在SD卡根目录下)private static final File USER_ICON = new File(Environment.getExternalStorageDirectory(), "user_icon.jpg");//请求识别码(分别为本地相册、相机、图片裁剪)private static final int CODE_PHOTO_REQUEST = 1;private static final int CODE_CAMERA_REQUEST = 2;private static final int CODE_PHOTO_CLIP = 3;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);buttonLocal = (Button) findViewById(R.id.buttonLocal);buttonCamera = (Button) findViewById(R.id.buttonCamera);imageView = (ImageView) findViewById(R.id.imageView);buttonLocal.setOnClickListener(this);buttonCamera.setOnClickListener(this);}//设置点击事件@Overridepublic void onClick(View view) {switch (view.getId()) {case R.id.buttonLocal://调用获取本地图片的方法getPicFromLocal();break;case R.id.buttonCamera://调用相机拍照的方法getPicFromCamera();break;default:break;}}/*** 从本机相册获取图片*/private void getPicFromLocal() {Intent intent = new Intent();// 获取本地相册方法一intent.setAction(Intent.ACTION_GET_CONTENT);intent.setType("image/*");//获取本地相册方法二
//        intent.setAction(Intent.ACTION_PICK);
//        intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
//                "image/*");startActivityForResult(intent, CODE_PHOTO_REQUEST);}/*** 通过相机拍摄获取图片,* 并存入设置的路径中*/private void getPicFromCamera() {Intent intent = new Intent();intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);// 下面这句指定调用相机拍照后的照片存储的路径intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(USER_ICON));startActivityForResult(intent, CODE_CAMERA_REQUEST);}/*** 图片裁剪** @param uri*/private void photoClip(Uri uri) {// 调用系统中自带的图片剪裁Intent intent = new Intent();intent.setAction("com.android.camera.action.CROP");intent.setDataAndType(uri, "image/*");// 下面这个crop=true是设置在开启的Intent中设置显示的VIEW可裁剪intent.putExtra("crop", "true");// aspectX aspectY 是宽高的比例intent.putExtra("aspectX", 1);intent.putExtra("aspectY", 1);/*outputX outputY 是裁剪图片宽高*这里仅仅是头像展示,不建议将值设置过高* 否则超过binder机制的缓存大小的1M限制* 报TransactionTooLargeException*/intent.putExtra("outputX", 150);intent.putExtra("outputY", 150);intent.putExtra("return-data", true);startActivityForResult(intent, CODE_PHOTO_CLIP);}/*** 提取保存裁剪之后的图片数据,并设置头像部分的View*/private void setImageToHeadView(Intent intent) {Bundle extras = intent.getExtras();if (extras != null) {Bitmap photo = extras.getParcelable("data");imageView.setImageBitmap(photo);}}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {// 用户没有进行有效的设置操作,返回if (resultCode == RESULT_CANCELED) {Toast.makeText(MainActivity.this, "取消", Toast.LENGTH_LONG).show();return;}switch (requestCode) {case CODE_CAMERA_REQUEST:if (USER_ICON.exists()) {photoClip(Uri.fromFile(USER_ICON));}break;case CODE_PHOTO_REQUEST:if (data != null) {photoClip(data.getData());}break;case CODE_PHOTO_CLIP:if (data != null) {setImageToHeadView(data);}break;}super.onActivityResult(requestCode, resultCode, data);}
}

这里要注意的是在裁剪图片时,长和宽不要设置太大,否则超过binder机制的缓存大小的限制(受手机配置影响).报TransactionTooLargeException,在代码中已经做了详细标注,请各位看官在实现的时候万万注意。

Android中通过访问本地相册或者相机设置用户头像相关推荐

  1. Android中使用OKHttp上传图片,从相机和相册中获取图片并剪切

    Android中使用OKHttp上传图片,从相机和相册中获取图片并剪切 效果: 注意: 1:网络权限 <uses-permission android:name="android.pe ...

  2. 在云手机中访问本地相册的方法

    概要:通过对云手机系统自带的图库模块进行定制,使得云手机的系统图库分为本地相册和云手机相册两部分.用户通过云手机客户端启动应用软件,当应用软件选择图片时,将会展示本地相册和云手机相册两部分供选择,如果 ...

  3. debian,ubuntu 安装mongodb 允许外网访问,修改端口,设置用户和密码

    使用apt安装mongodb: apt update && apt install mongodb 查看运行状态: systemctl status mongodb.service 结 ...

  4. Android中保存图片到本地功能实现

    文章转载自http://blog.csdn.net/ccpat/article/details/45314175  感谢原作者~ 本文描述将一个Bitmap对象保存为一个图片文件的主要步骤.保存的图片 ...

  5. 使用Xamarin.Android中的Google登录OAuth 2.0对用户进行身份验证

    什么是用户认证? (What is User Authentication?) There is a user base associated with every app that is avail ...

  6. Android中ListView的使用以及使用适配器设置数据源

    场景 Android中使用Adapter(适配器)给RecycleView设置数据源: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/detail ...

  7. android中按一个按钮弹出字,允许用户在Android中长按一次即可编辑按钮文字

    我想允许App用户在Android中更改Button文本. 当用户单击按钮时,它应该执行某些操作,但是当他/她长按按钮时,将弹出一个编辑文本,并且无论用户键入什么内容都应另存为按钮文本. 到目前为止, ...

  8. Android Studio 环信IM聊天设置用户头像

    环信IM中的DemoHelper提供了实现设置聊天头像的方法,但是我们有时候不希望按照demo的基础进行开发,或者把整个demo作为依赖导入主项目中.其实在easeui中提供了一个EaseUserPr ...

  9. 调用android的拍照或本地相册选取再实现相片上传服务器,Android调用系统相机、本地相册上传图片(头像上传(裁剪)、多张图片上传)...

    开发中基本上都会有头像上传的功能,有的app还需要多张图片同时上传,下面简单将头像上传以及多张图片上传功能整理一下.图片选择仿照微信选择图片的界面.[参考] 多图片选择器 !!!推荐一个动态权限请求的 ...

最新文章

  1. java 继承多态的一些理解和不理解
  2. 医院(jzoj 1611)
  3. Android开发小技巧之商品属性筛选与商品筛选
  4. 计算机显示技术发展,显示技术
  5. PATB1017 A除以B
  6. flacs 安装教程_文章详细信息
  7. 使用 Visual Studio Code 编写 TypeScript
  8. 解决前端做excel下载的文件打不开
  9. android重力传感器横竖反,Android重力传感器--随重力旋转的图标
  10. 【超详细教程(附源码)】基于 ARM Cortex-M3 处理器与 FPGA 的实时人脸检测 SOC
  11. 用这8个办公软件,效率高一倍
  12. 应届毕业生不想应聘上班,一心想独自创业,有什么好的项目推荐?
  13. docker里面安装supervisor
  14. 机器学习【逻辑回归】——logistic函数逻辑回归鸢尾花分类
  15. 深度神经网络对人工智能推动的发展评述与应用分析
  16. 个人作业2:APP案例分析
  17. 【边缘设备】基于RK3399核心板的nanoPC-T4 线刷桌面版系统
  18. 4.9 朗斯基行列式
  19. 护理个人简历模板范文--带具体内容
  20. 怎么用账号登陆公司服务器地址,大企业邮箱登录入口,如何在foxmail上设置企业邮箱账号?...

热门文章

  1. 安卓应用层与底层驱动之间的调用
  2. 4月13日,千里之行,始于足下
  3. python美团外卖_用python模拟美团外卖骑手推送请求
  4. 期末作业成品代码——麦路客电子购物商城(37页) HTML5期末考核大作业,网站——购物商城
  5. 公众号微信一键登录 app微信一键登录
  6. Python标识符命名规范
  7. (新浪)微博(iPad)客户端怎么查看已经收藏的微博
  8. 可以用php做出一个圆锥吗,CST MWS如何将模型共形到一个圆锥曲面上
  9. FreeSql 新的八大骚功能,.NETCore 你必须晓得的 ORM
  10. chrome 网页截图插件