Android中通过访问本地相册或者相机设置用户头像实例

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

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

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

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

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

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

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

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

简单布局文件这里不再做赘述,本次试验使用隐式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,在代码中已经做了详细标注,请各位看官在实现的时候万万注意。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

时间: 2024-09-28 21:05:13

Android中通过访问本地相册或者相机设置用户头像实例的相关文章

如何在Android模拟器上访问本地的Web应用

本篇文章试图解决这样一个问题:如何在Android模拟器上访问本地的Web应用? 例如,在你的开发机器上 启动一个Tomcat服务,接着打开电脑上的浏览器,默认情况下输入http://localhost:8080/就能够访问到 Tomcat的主页面:那么,如果我们想在Android模拟器上来访问,可以吗?答案是肯定的,但是访问的URL会有 所变化,这又是为什么呢?请继续往下看. 在一般的Java Web程序开发中,我们通常使用localhost或者 127.0.0.1来访问本机的Web服务,但是

服务器-android模拟器无法访问本地web应用,用10.0.2.2也不行

问题描述 android模拟器无法访问本地web应用,用10.0.2.2也不行 我为什么不能用android模拟器访问本地web应用啊,我是用10.0.2.2的ip也不行 本地服务器是正常的 模拟器访问不到(我的tomcat端口号已经改成了80) 我也是穷人0金币啊,希望大家帮帮我 解决方案 解决了,服务器的问题,弄了个新的服务器就好了 解决方案二: ANDROID模拟器访问本地WEB应用 Android模拟器访问本地Web应用

服务器-android中网络访问不了。

问题描述 android中网络访问不了. 做一个小应用,android传输数据到javaEE服务器端,网络一直访问不了. 不过把 <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="8" /> 中的版本改成8就可以访问了,本来都是14的,各位大神知道这是什么原因吗? 解决方案 android访问不了 解决方案二: 1.一般访问网络需要在AndroidManifest.xml中声明使用

Android中RecyclerView上拉下拉,分割线,多条目的实例代码

//activity的xml <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity

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

为了测试开发的手机网站,常常需要使手机直接访问本地网络. 在这个过程中碰到几个问题,记下来供以后参考 1. 在本地主机运行apache后,使用localhost和127.0.0.1可以访问页面,但使用IP(即192.168.1.*)访问时得到403 解决:这是由于httpd.conf的安全限制导致.打开httpd.conf, 搜索127.0.0.1,注释Deny from all,增加一行Allow from 192.168.1.*.修改后的配置如下: #    # Controls who c

Android 中Crash时如何获取异常信息详解及实例

Android 中Crash时如何获取异常信息详解 前言: 大家都知道,Android应用不可避免的会发生crash,无论你的程序写的多完美,总是无法完全避免crash的发生,可能是由于Android系统底层的bug,也可能是由于不充分的机型适配或者是糟糕的网络状况.当crash发生时,系统会kill掉你的程序,表现就是闪退或者程序已停止运行,这对用户来说是很不友好的,也是开发者所不愿意看到的,更糟糕的是,当用户发生了crash,开发者却无法得知程序为何crash,即便你想去解决这个crash,

Android中WebView载入本地HTML代码并实现Java与JavaScript交互的例子

正在开发一个地图程序, 相对于用XML写安卓界面, 我更愿意用这个偷懒的办法,就是不用Android自带的MapView, 而是使用之前就已经比较熟悉的Google Maps JavaScript API, 在Android的WebView中载入HTML代码, 利用Android提供的强大的Java与Js的交互功能,用网页作为界面来开发程序,同时也可以用Js回调机器的本地功能比如GPS等. 下面提供一个演示的例子,代码如下: 1package com.aloong.map; 2 3import 

Android自定义组件获取本地图片和相机拍照图片

iOS中有封装好的选择图片后长按出现动画删除效果,效果如下 而Android找了很久都没有找到有这样效果的第三方组件,最后懒得找了还是自己实现这效果吧 选择图片后还可对图片进行剪裁 当然,代码中还有很多不完善的地方,我接下来会继续完善这个组件的 已经上传到开源社区,欢迎大家来Star啊~ Demo源码:传送门 设计中的碰到的一些问题和解决思路 1.如何让加号图片显示在GridView最后面 首先在调用GridAdapter构造方法时就加载加号图片 /** * 图片适配器 * @param con

Android中ViewPager实现滑动条及与Fragment结合的实例教程

自主实现滑动指示条 先上一个基本效果图: 1.XML布局 布局代码如下: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="m