目前几乎所有的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;
@Override
protected 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);
}
//设置点击事件
@Override
public 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);
}
}
@Override
protected 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. [iOS 开发] app无法访问本地相册,且不显示在设置 -隐私 - 照片中

    近几天在使用iOS8的Photos Framework访问本地相册时,app即不会弹出是否允许访问提示框,也无法显示在iPhone的设置-隐私-照片的访问列表中,代码如下: PHAuthorizati ...

  2. 浅谈Android中拍照、从相册选择图片并截图相关知识点

    前言 我们在Android开发中经常会需要使用相机或者从相册中选取图片的情况,今天就把这里面相关的知识点总结下,方便以后开发的时候使用. 1.相机拍照并可自定义截图功能 我们先来看如何使用Intent ...

  3. Android手机浏览器访问本地网络相关问题

    为了测试开发的手机网站,常常需要使手机直接访问本地网络. 在这个过程中碰到几个问题,记下来供以后参考 1. 在本地主机运行apache后,使用localhost和127.0.0.1可以访问页面,但使用 ...

  4. h5开发中,利用微信或者QQ登陆以后获取用户头像在canvas画布显示问题

    在实际开发上先的h5页面产品中,总会遇到各种坑,好多坑都是安卓和iPhone端兼容的问题(用电脑谷歌浏览器输入  chrome://inspect/#devices可以用手机USB调试,打开) eg: ...

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

    效果:注意:1:网络权限<;;;); intent.putExtra(); ); intent.putExtra(); intent.putExtra(, byteArrayOutputStre ...

  6. android 中activity调用本地service中的方法。

    1.自定义一个接口,暴露服务中的方法 public interface IService {    /**服务中对外暴露的方法 */    void methodInService();} 2.自定一 ...

  7. Android项目实战(五十八):Android 保存图片文件到本地,相册/图库查看不到的处理

    将一个图片文件写入到本地目录,然后去相册查看,会查找不到这个图片文件,但是去文件目录下查找,确确实实有该图片文件. 问题在于相册是一个独立的app,它并不会去刷新本地图片,所以需要在写图片文件成功之后 ...

  8. Android中通过ImageSwitcher实现相册滑动查看照片功能(附代码下载)

    场景 效果 注: 博客: https://blog.csdn.net/badao_liumang_qizhi关注公众号 霸道的程序猿 获取编程相关电子书.教程推送与免费下载. 实现 将需要滚动查看的照 ...

  9. mui调用本地相册调用相机上传照片

    调用mui的常用库和jquery html部分: <header class="mui-bar mui-bar-nav"> <a class="mui- ...

随机推荐

  1. $GLOBALS['HTTP_RAW_POST_DATA'] 和$_POST的区别(转)

    ---恢复内容开始--- $_POST:通过 HTTP POST 方法传递的变量组成的数组.是自动全局变量. $GLOBALS['HTTP_RAW_POST_DATA'] :总是产生 $HTTP_RA ...

  2. careercup-排序和查找 11.3

    11.3 给定一个排序后的数组,包含n个整数,但这个数组已被旋转很多次,次数不详.请编写代码找出数组中的某个元素.可以假定数组元素原先是按从小到大的顺序排序的. 解法: 可以直接从开始一个一个比较,也 ...

  3. 进程环境之setjmp和longjmp函数

    在C中,goto语句是不能跨越函数的,而执行这样跳转功能的是函数setjmp和longjmp.这两个函数对于处理发生在深层嵌套函数调用中的出错情况是非常有用的. setjmp和longjmp函数也称为 ...

  4. tarball文件安装的大概流程

    ./configure这个步骤就是在创建 Makefile 这个文件罗!通常程序开发者会写一支 scripts 来检查你的 Linux 系统.相关的软件属性等等,这个步骤相当的重要, 因为未来你的安装 ...

  5. 转:ORACLEERP开发基础之EBS开发基础

    转自:http://blog.itpub.net/8781091/viewspace-1012244/ [内容导航] 第1页:开发工具安装 第2页:增加数据块 第3页:注册表单FORM 第4页:注册请 ...

  6. 九度 1371 最小的K个数

    题目描述:输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 输入: 每个测试案例包括2行:第一行为2个整数n,k(1<= ...

  7. 前后端分离 接口管理神器——Rap本地搭建

    我这里要用做mockserver的就是rap了,rap结合了团队管理,项目管理,文档编写.Mock.js.可视化.接口过渡.文档历史版本(赞).mock插件(线上线下切换就只需要注释一句代码就OK), ...

  8. java 静态方法

    在使用java的时候,你会发现,有些对象,需要new ,有些则不需要时,比如Math类 ); 如果你查看源码就会大致的发现,里面的属性和方法都是静态的: public static double si ...

  9. (转) ASP.NET页面缓存

    原文:http://www.cnblogs.com/Sky_KWolf/archive/2010/12/05/1897158.html 静态页面全部内容保存在服务器内存中.当再有请求时,系统将缓存中的 ...

  10. StringToInt

    public class Stringtoint {    public static void stringtoint(String s){        //判断字符串是否为null和是否为空   ...