Android中通过访问本地相册或者相机设置用户头像
目前几乎所有的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中通过访问本地相册或者相机设置用户头像的更多相关文章
- [iOS 开发] app无法访问本地相册,且不显示在设置 -隐私 - 照片中
近几天在使用iOS8的Photos Framework访问本地相册时,app即不会弹出是否允许访问提示框,也无法显示在iPhone的设置-隐私-照片的访问列表中,代码如下: PHAuthorizati ...
- 浅谈Android中拍照、从相册选择图片并截图相关知识点
前言 我们在Android开发中经常会需要使用相机或者从相册中选取图片的情况,今天就把这里面相关的知识点总结下,方便以后开发的时候使用. 1.相机拍照并可自定义截图功能 我们先来看如何使用Intent ...
- Android手机浏览器访问本地网络相关问题
为了测试开发的手机网站,常常需要使手机直接访问本地网络. 在这个过程中碰到几个问题,记下来供以后参考 1. 在本地主机运行apache后,使用localhost和127.0.0.1可以访问页面,但使用 ...
- h5开发中,利用微信或者QQ登陆以后获取用户头像在canvas画布显示问题
在实际开发上先的h5页面产品中,总会遇到各种坑,好多坑都是安卓和iPhone端兼容的问题(用电脑谷歌浏览器输入 chrome://inspect/#devices可以用手机USB调试,打开) eg: ...
- Android中使用OKHttp上传图片,从相机和相册中获取图片并剪切
效果:注意:1:网络权限<;;;); intent.putExtra(); ); intent.putExtra(); intent.putExtra(, byteArrayOutputStre ...
- android 中activity调用本地service中的方法。
1.自定义一个接口,暴露服务中的方法 public interface IService { /**服务中对外暴露的方法 */ void methodInService();} 2.自定一 ...
- Android项目实战(五十八):Android 保存图片文件到本地,相册/图库查看不到的处理
将一个图片文件写入到本地目录,然后去相册查看,会查找不到这个图片文件,但是去文件目录下查找,确确实实有该图片文件. 问题在于相册是一个独立的app,它并不会去刷新本地图片,所以需要在写图片文件成功之后 ...
- Android中通过ImageSwitcher实现相册滑动查看照片功能(附代码下载)
场景 效果 注: 博客: https://blog.csdn.net/badao_liumang_qizhi关注公众号 霸道的程序猿 获取编程相关电子书.教程推送与免费下载. 实现 将需要滚动查看的照 ...
- mui调用本地相册调用相机上传照片
调用mui的常用库和jquery html部分: <header class="mui-bar mui-bar-nav"> <a class="mui- ...
随机推荐
- sigar监控
相关参照博客: http://liningjustsoso.iteye.com/blog/1254584 http://blog.csdn.net/aoxida/article/category/12 ...
- 通用块层、IO调度层以及设备驱动层的数据结构
http://blog.chinaunix.net/uid-28897358-id-3775640.html
- 谈谈Javascript线程
其实,大家都知道Javascript的语言执行环境是单线程的,浏览器无论在什么时候都有且只有一个线程在运行Javascript程序.那Ajax发送异步请求怎么解释,setTimeout/s ...
- arcgis通过 Python 使用工具 获得结果信息
通过 Python 使用工具 ArcGIS 10 每个地理处理工具都具有一组固定的参数,这些参数为工具提供执行所需的信息.工具通常具有定义一个或多个数据集的输入参数,这些数据集一般用于生成新的输出数据 ...
- su: cannot set user id: Resource temporarily unavailable
今天R&D所在主机出现su: cannot set user id: Resource temporarily unavailable资源不可用报错,直接通过其他机器ssh huyuh@xxx ...
- css position 定位
fixed 属于绝对定位,相对于浏览器窗口定位 (IE 6不支持) relative 相对定位,通过设置垂直或水平位置,让这个元素"相对于"它的原始起点进行移动. ...
- Unity3D 之3D游戏SD快打 3D游戏基础入门开发全(1)
这里记录一个U3D游戏,3D游戏的基本开发. 导入素材 1.首先导入需要的素材.因为FBX格式的素材是通用的,所以尽量导入这样的资源使用 导入后的结果: 然后对人形骨骼进行设置. 看哪里没有映射到骨骼 ...
- 多个线程访问url
多个线程访问url package com.aig.ecompassios.ecard; import java.io.BufferedReader; import java.io.InputStre ...
- PHP简单MVC架构
http://blog.csdn.net/haiqiao_2010/article/details/12166283 由于需要搭建一个简单的框架来进行API接口开发,所以简单的mvc框架当然是首选.最 ...
- ios objection
给大家介绍个不错的团队开发模块化工具objection 1. setup<这里我只介绍ios相关> rake artifact:ios cp -R build/Release-iphone ...