目前几乎所有的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. Windows 自己主动关机命令 shuntdown

    以下介绍一个在Windows XP下实现定时关机的简单方法. 一 .倒计时关机:      指定系统在10分钟后自己主动关闭:点击“開始→执行”,输入命令“Shutdown -s -t 60”(注意: ...

  2. native为本地方法

    在java中,native方法是指本地方法,当在方法中调用一些不是由java语言写的代码或者在方法中用java语言直接操纵计算机硬件时要声明为native方法. native方法的执行依赖于JVM的设 ...

  3. careercup-递归和动态规划 9.7

    9.7 编写函数,实现许多图片编辑软件都支持的“填充颜色”功能.给定一个屏幕(以二维数组表示,元素为颜色值).一个点和一个新的颜色值,将新颜色值填入这个点的周围区域,直到原来的颜色值全部改变. 类似l ...

  4. sort函数的例子

    10.11编写程序,使用stable_sort和isShorter将传递给你的elimDups版本的vector排序.打印vector的内容. #include<algorithm> #i ...

  5. C#自动实现的属性

    using System; using System.Collections.Generic; using System.Text; namespace 自动属性 { class Program { ...

  6. 详解ExplosionField的使用,实现View的粉碎效果

    小米平板卸载软件的时候,会有一个粉碎的效果,看起来很拉风,GitHub上有一个开源控件可以实现这个效果,我们一起来看看.先来看看效果图: 看起来不错吧,那我们今天就来详细说说ExplosionFiel ...

  7. IOS设备上给body绑定click事件不生效及其解决办法

    事件背景: 最近在做一个移动端业务的时候碰到一个bug,在ios上对body绑定click事实现事件代理冒泡至某些元素上尽然不生效. 思考: 暂借助jquery展示下事件绑定代码,将所有标签含有dat ...

  8. 混合文件系统(ramdisk+jffs)

    背景知识: 一.Ramdisk文件系统: 1.掉电丢失 2.读写速度高 3.数据存储到内存 二.jffs文件系统 1.掉电不丢失 2.可存储于NOR NAND,但是适用于NOR 3.数据存储于flas ...

  9. Objective-c中autorelease的释放时机

    如果你使用过MRR,autorelease这个关键字应该是太熟悉了,每次在我们生成一个新的对象返回时,都需要向这个对象发送autorelease消息,目的是为了延时释放创建的对象.那到底是在什么时候, ...

  10. Base64 encode/decode large file

    转载:http://www.cnblogs.com/jzywh/archive/2008/04/20/base64_encode_large_file.html The class System.Co ...