Android通过手机拍照或从本地相册选取图片设置头像

像微信、QQ、微博等社交类的APP,通常都有设置头像的功能,设置头像通常有两种方式:

1、让用户通过选择本地相册之类的图片库中已有的图像,裁剪后作为头像。

2、让用户启动手机的相机拍照,拍完照片后裁剪,然后作为头像。

我现在写一个简单的完整代码例子,说明如何在android中实现上述两个头像设置功能。

MainActivity.Java文件:

package zhangpgil.photo;

import java.io.File;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;

public class MainActivity extends ActionBarActivity {

 /* 头像文件 */
 private static final String IMAGE_FILE_NAME = "temp_head_image.jpg";

 /* 请求识别码 */
 private static final int CODE_GALLERY_REQUEST = 0xa0;
 private static final int CODE_CAMERA_REQUEST = 0xa1;
 private static final int CODE_RESULT_REQUEST = 0xa2;

 // 裁剪后图片的宽(X)和高(Y),480 X 480的正方形。
 private static int output_X = 480;
 private static int output_Y = 480;

 private ImageView headImage = null;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);

 headImage = (ImageView) findViewById(R.id.imageView);

 Button buttonLocal = (Button) findViewById(R.id.buttonLocal);
 buttonLocal.setOnClickListener(new View.OnClickListener() {

  @Override
  public void onClick(View v) {
  choseHeadImageFromGallery();
  }
 });

 Button buttonCamera = (Button) findViewById(R.id.buttonCamera);
 buttonCamera.setOnClickListener(new View.OnClickListener() {

  @Override
  public void onClick(View v) {
  choseHeadImageFromCameraCapture();
  }
 });
 }

 // 从本地相册选取图片作为头像
 private void choseHeadImageFromGallery() {
 Intent intentFromGallery = new Intent();
 // 设置文件类型
 intentFromGallery.setType("image/*");
 intentFromGallery.setAction(Intent.ACTION_GET_CONTENT);
 startActivityForResult(intentFromGallery, CODE_GALLERY_REQUEST);
 }

 // 启动手机相机拍摄照片作为头像
 private void choseHeadImageFromCameraCapture() {
 Intent intentFromCapture = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

 // 判断存储卡是否可用,存储照片文件
 if (hasSdcard()) {
  intentFromCapture.putExtra(MediaStore.EXTRA_OUTPUT, Uri
   .fromFile(new File(Environment
    .getExternalStorageDirectory(), IMAGE_FILE_NAME)));
 }

 startActivityForResult(intentFromCapture, CODE_CAMERA_REQUEST);
 }

 @Override
 protected void onActivityResult(int requestCode, int resultCode,
  Intent intent) {

 // 用户没有进行有效的设置操作,返回
 if (resultCode == RESULT_CANCELED) {
  Toast.makeText(getApplication(), "取消", Toast.LENGTH_LONG).show();
  return;
 }

 switch (requestCode) {
 case CODE_GALLERY_REQUEST:
  cropRawPhoto(intent.getData());
  break;

 case CODE_CAMERA_REQUEST:
  if (hasSdcard()) {
  File tempFile = new File(
   Environment.getExternalStorageDirectory(),
   IMAGE_FILE_NAME);
  cropRawPhoto(Uri.fromFile(tempFile));
  } else {
  Toast.makeText(getApplication(), "没有SDCard!", Toast.LENGTH_LONG)
   .show();
  }

  break;

 case CODE_RESULT_REQUEST:
  if (intent != null) {
  setImageToHeadView(intent);
  }

  break;
 }

 super.onActivityResult(requestCode, resultCode, intent);
 }

 /**
 * 裁剪原始的图片
 */
 public void cropRawPhoto(Uri uri) {

 Intent intent = new Intent("com.android.camera.action.CROP");
 intent.setDataAndType(uri, "image/*");

 // 设置裁剪
 intent.putExtra("crop", "true");

 // aspectX , aspectY :宽高的比例
 intent.putExtra("aspectX", 1);
 intent.putExtra("aspectY", 1);

 // outputX , outputY : 裁剪图片宽高
 intent.putExtra("outputX", output_X);
 intent.putExtra("outputY", output_Y);
 intent.putExtra("return-data", true);

 startActivityForResult(intent, CODE_RESULT_REQUEST);
 }

 /**
 * 提取保存裁剪之后的图片数据,并设置头像部分的View
 */
 private void setImageToHeadView(Intent intent) {
 Bundle extras = intent.getExtras();
 if (extras != null) {
  Bitmap photo = extras.getParcelable("data");
  headImage.setImageBitmap(photo);
 }
 }

 /**
 * 检查设备是否存在SDCard的工具方法
 */
 public static boolean hasSdcard() {
 String state = Environment.getExternalStorageState();
 if (state.equals(Environment.MEDIA_MOUNTED)) {
  // 有存储的SDCard
  return true;
 } else {
  return false;
 }
 }
}

布局文件有三个组件:放置头像的ImageView,两个Button,其中一个Button触发从本地相册选取图片作为头像的操作时间;另外一个Button触发手机拍摄照片作为头像的操作事件。

activity_main.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical" >

  <ImageView
    android:id="@+id/imageView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/ic_launcher" />

  <Button
    android:id="@+id/buttonLocal"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="本地相册选取头像" />

  <Button
    android:id="@+id/buttonCamera"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="手机拍照选取头像" />

</LinearLayout>

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

时间: 2017-07-11

Android获取本地相册图片和拍照获取图片的实现方法

需求:从本地相册找图片,或通过调用系统相机拍照得到图片. 容易出错的地方: 1.当我们指定了照片的uri路径,我们就不能通过data.getData();来获取uri,而应该直接拿到uri(用全局变量或者其他方式)然后设置给imageView imageView.setImageURI(uri); 2.我发现手机前置摄像头拍出来的照片只有几百KB,直接用imageView.setImageURI(uri);没有很大问题,但是后置摄像头拍出来的照片比较大,这个时候使用imageView.setIm

Android自定义相机实现定时拍照功能

这篇博客为大家介绍Android自定义相机,并且实现倒计时拍照功能. 首先自定义拍照会用到SurfaceView控件显示照片的预览区域,以下是布局文件: activity_main.xml <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="m

Android 通过Intent调用系统拍照程序出现图片太小的问题解决办法

Android 通过Intent调用系统拍照程序出现图片太小的问题解决办法 Intent it = newIntent("android.media.action.IMAGE_CAPTURE"); startActivityForResult(it, Activity.DEFAULT_KEYS_DIALER); 按下拍照键后,会返回到你的activity,所以你的activity要在onActivityResult方法里加一个处理, protectedvoidonActivityRes

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

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

Android部分手机拍照后获取的图片被旋转问题的解决方法

调用Android系统拍照功能后,三星手机拍摄后的照片被旋转了90度,横着拍给你变成竖的,竖的拍给你变成横的.其它品牌的手机都是正常的,就三星出现这个怪事. 在Android适配上,我原来一直以为国内的小米手机够奇葩了,结果还有更奇葩的!你说你没事旋转照片干啥,实在是猜不透其居心何在,纯粹是在给开发者制造麻烦啊! 解决办法是获取到拍照后照片被旋转的角度,再旋转回去就好了. 具体思路: 1.首先在调用拍照方法时,保存拍照后的相片原图,得到原图路径,(PhotoBitmapUtils是我自己写的一个

Android判断是否有拍照权限的实例代码

下面一段代码给大家介绍android判断是否有拍照权限,具体代码如下所示: /** * 返回true 表示可以使用 返回false表示不可以使用 */ public boolean cameraIsCanUse() { boolean isCanUse = true; Camera mCamera = null; try { mCamera = Camera.open(); Camera.Parameters mParameters = mCamera.getParameters(); //针对

Android 7.0中拍照和图片裁剪适配的问题详解

前言 Android 7.0系统发布后,拿到能升级的nexus 6P,就开始了7.0的适配.发现在Android 7.0以上,在相机拍照和图片裁剪上,可能会碰到以下一些错误: Process: com.yuyh.imgsel, PID: 22995 // 错误1 android.os.FileUriExposedException: file:///storage/emulated/0/Android/data/com.yuyh.imgsel/cache/1486438962645.jpg ex

Android仿微信单击拍照长按录像功能实例代码

此文章是看郭神公众号发的一篇,仅作学习. 在modlue gradle中添加 compile 'cjt.library.wheel:camera:0.0.7' 在project gradle中添加 compile 'cjt.library.wheel:camera:0.0.7' 添加的地方是 allprojects { repositories { jcenter() /*在此处添加*/ } } 使用起来很方便,只需在xml布局中 <com.cjt2325.cameralibrary.JCame

Android Camera实现毫秒级拍照实例

我们知道自定义Camera需要以下几步 打开相机,即实例化Camera对象,Camera camera = Camera.open(); 设置Camera的相关参数,Camera.Parameters parameters = camera.getParameters(); 打开预览,camera.setPreviewDisplay(surfaceholder); camera.startPreview(); 获取图片,这里只是从预览中获取因此使用,camera.setPreviewCallb

使用bitset实现毫秒级查询(实例讲解)

前言 因为业务要求api的一次请求响应时间在10ms以内,所以传统的数据库查询操作直接被排除(网络io和磁盘io).通过调研,最终使用了bieset,目前已经正常运行了很久 bitset介绍 看JDK中的解释简直一头雾水,用我自己的理解概括一下 1.bitset的内部实现是long数组 2.set中每一个位的默认值为false(0) 3.bitset长度按需增长 4.bitset非线程安全 bitset关键方法分析 /** * Sets the bit at the specified inde

Android中使用Camera类编写手机拍照App的实例教程

Camera是Android摄像头硬件的相机类,位于硬件包"android.hardware.Camera"下.它主要用于摄像头捕获图片.启动/停止预览图片.拍照.获取视频帧等,它是设备本地的服务,负责管理设备上的摄像头硬件. Camera既然用于管理设备上的摄像头硬件,那么它也为开发人员提供了相应的方法,并且这些方法大部分都是native的,用C++在底层实现,下面简单介绍一下Camera的一些方法: static Camera open():打开Camera,返回一个Camera实

android自定义Camera实现录像和拍照

本文实例为大家分享了android自定义Camera实现录像和拍照的具体代码,供大家参考,具体内容如下 源码: package com.example.myvideocamera; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; im

android camera yuv帧水平翻转实例

Camera预览时需要对yuv帧做水平翻转处理,直接在onPreviewFrame(byte[] data, Camera camera)里调用Mirror函数,处理完后的图片和预览效果成水平翻转关系. nv21的镜像算法: private void Mirror(byte[] src, int w, int h) { //src是原始yuv数组 int i; int index; byte temp; int a, b; //mirror y for (i = 0; i < h; i++) {

Android 编辑头像功能简单实现实例(图片选取,裁剪)

本文介绍了Android 编辑头像功能的简单实例,可以实现拍照,图片选取,裁剪. 拍照 public static void startCamera(Fragment fragment){ File file=new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM)+ File.separator+"user_icon.jpg"); Intent intent=new Inten

Android实现调用摄像头进行拍照功能

现在Android智能手机的像素都会提供照相的功能,大部分的手机的摄像头的像素都在1000万以上的像素,有的甚至会更高.它们大多都会支持光学变焦.曝光以及快门等等. 下面的程序Demo实例示范了使用Camera v2来进行拍照,当用户按下拍照键时,该应用会自动对焦,当对焦成功时拍下照片. layout/activity_main.xml界面布局代码如下: <?xml version="1.0" encoding="utf-8"?> <manifes

Android打开系统相机并拍照的2种显示方法

本文实例为大家分享了Android打开系统相机并拍照的具体实现代码,供大家参考,具体内容如下 目标效果: 第二张为点击第一个按钮拍照后显示的,比较模糊,第三章为点击第二个按钮拍照后显示的,比较清楚. 1.activity_main.xml页面设置布局. activity_main.xml页面: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="h

C#使用StopWatch获取程序毫秒级执行时间的方法

本文实例讲述了C#使用StopWatch获取程序毫秒级执行时间的方法.分享给大家供大家参考.具体分析如下: 这个比时间通过DateTime在程序前后记录时间,然后通过TimeSpan相减的办法要精确,也更容易理解. using System.Diagnostics;//引用相关的命名空间 Stopwatch st=new Stopwatch ();//实例化类 st. Start();//开始计时 //需要统计时间的代码段 st.Stop();//终止计时 Response.Write(st.E

Android camera实时预览 实时处理,人脸识别示例

Android camera实时预览 实时处理,面部认证. 预览操作是网友共享的代码,我在继承SurfaceView 的CameraSurfaceView 中加入了帧监听事件,每次预览监听前五个数据帧,在处理做一个面部识别. 先看目录关系 自定义控件CameraSurfaceView.java 自定义接口方法CameraInterface.java CameraActivity预览界面. CameraSurfaceView.Java package com.centaur.camera.prev