Android更换头像功能实现

现在不管什么APP都有个头像,如果你看见没有头像的APP就会感觉非常奇怪,以前头像都是方的,后来就变成圆的,我估计在过个几年就得来个五角星形状的头像,下面我把更换头像的代码写来:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <ImageView
        android:id="@+id/iv_head"
        android:layout_width="200dip"
        android:layout_height="200dip"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="210dip"
        android:src="@drawable/ic_launcher" />

    <Button
        android:id="@+id/btn_takephoto"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:text="拍照" />

    <Button
        android:id="@+id/btn_photos"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:text="从相册取" />

</RelativeLayout>

首先我定义了一个非常简单的XML布局,里面两个Button,一个ImageView用来显示头像:

下面我来看看MainActivity代码:

package com.example.changhead;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;

@SuppressLint("SdCardPath")
public class MainActivity extends Activity implements OnClickListener {
	private ImageView ivHead;//头像显示
	private Button btnTakephoto;//拍照
	private Button btnPhotos;//相册
	private Bitmap head;//头像Bitmap
	private static String path="/sdcard/myHead/";//sd路径

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

	private void initView() {
		//初始化控件
		btnPhotos = (Button) findViewById(R.id.btn_photos);
		btnTakephoto = (Button) findViewById(R.id.btn_takephoto);
		btnPhotos.setOnClickListener(this);
		btnTakephoto.setOnClickListener(this);
		ivHead = (ImageView) findViewById(R.id.iv_head);
		Bitmap bt = BitmapFactory.decodeFile(path + "head.jpg");//从Sd中找头像,转换成Bitmap
		if(bt!=null){
			@SuppressWarnings("deprecation")
			Drawable drawable = new BitmapDrawable(bt);//转换成drawable
			ivHead.setImageDrawable(drawable);
		}else{
			/**
			 *	如果SD里面没有则需要从服务器取头像,取回来的头像再保存在SD中
			 *
			 */
		}

	}

	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.btn_photos://从相册里面取照片
			Intent intent1 = new Intent(Intent.ACTION_PICK, null);
			intent1.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
			startActivityForResult(intent1, 1);
			break;
		case R.id.btn_takephoto://调用相机拍照
			Intent intent2 = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
			intent2.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(Environment.getExternalStorageDirectory(),
							"head.jpg")));
			startActivityForResult(intent2, 2);//采用ForResult打开
			break;
		default:
			break;
		}
	}
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		switch (requestCode) {
		case 1:
			if (resultCode == RESULT_OK) {
				cropPhoto(data.getData());//裁剪图片
			}

			break;
		case 2:
			if (resultCode == RESULT_OK) {
				File temp = new File(Environment.getExternalStorageDirectory()
						+ "/head.jpg");
				cropPhoto(Uri.fromFile(temp));//裁剪图片
			}

			break;
		case 3:
			if (data != null) {
				Bundle extras = data.getExtras();
				head = extras.getParcelable("data");
				if(head!=null){
					/**
					 * 上传服务器代码
					 */
					setPicToView(head);//保存在SD卡中
					ivHead.setImageBitmap(head);//用ImageView显示出来
				}
			}
			break;
		default:
			break;

		}
		super.onActivityResult(requestCode, resultCode, data);
	};
	/**
	 * 调用系统的裁剪
	 * @param uri
	 */
	public void cropPhoto(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", 150);
		intent.putExtra("outputY", 150);
		intent.putExtra("return-data", true);
		startActivityForResult(intent, 3);
	}
	private void setPicToView(Bitmap mBitmap) {
		 String sdStatus = Environment.getExternalStorageState();
        if (!sdStatus.equals(Environment.MEDIA_MOUNTED)) { // 检测sd是否可用
               return;
           }
		FileOutputStream b = null;
		File file = new File(path);
		file.mkdirs();// 创建文件夹
		String fileName =path + "head.jpg";//图片名字
		try {
			b = new FileOutputStream(fileName);
			mBitmap.compress(Bitmap.CompressFormat.JPEG, 100, b);// 把数据写入文件

		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} finally {
			try {
				//关闭流
				b.flush();
				b.close();
			} catch (IOException e) {
				e.printStackTrace();
			}

		}
}
}

上面的注释已经很详细了,就这些

对了不要忘记加权限:

<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>  

源码下载

时间: 2024-12-11 10:15:35

Android更换头像功能实现的相关文章

【学习ios之路:UI系列】点击更换头像实现从相册读取照片和拍照两种功能

功能如下: 1.点击头像,提示选择更换头像方式①相册 ②照相. 2.点击相册,实现通过读取系统相册,获取图片进行替换. 3.点击照相,通过摄像头照相,进行替换照片. 4.如果摄像头,弹出框警告. 代码如下: 1.通过UIActionSheet对象实现提示功能 //创建对象 UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle: @"提示" delegate:self cancelButtonTitle:@&q

apk分享: Android应用更换皮肤功能的实现思路教程。

Android 的发展确实太快了,每年的都有很多新东西出现,想要覆盖所有新东西感觉也不太可能,我这里主要说一下主要的 Android 的主要新技术发展,其实了解 Android 的发展趋势,可能对开发者更有帮助. 开发工具 Android Studio: Google 官方放弃 Eclipse 和 Android Studio 普及.AS 虽然不算新,但是对 Android Studio 这个软件的更新速度快的惊人,有大量的新功能发布.例如支持很多注解代码提示注解.Live code templ

【Android】更换头像的实现

现在不管什么APP都有个头像,如果你看见没有头像的APP就会感觉非常奇怪,以前头像都是方的,后来就变成圆的,我估计在过个几年就得来个五角星形状的头像,下面我把更换头像的代码写来: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width

升级IOS8游戏上传自定义头像功能失效的问题

为了支持arm64,之前已经折腾了很久,昨晚打包准备提交苹果审核时,测试那边的同事反馈说游戏上传自定义头像功能不可用了. 游戏上传自定义功能的简介:卡牌游戏最初是<比武招亲>中有一个充VIP之后就可使用了上传自定义功能的特权,我们的游戏就"复制"了该功能.   具体实现就是点击游戏内换自定义头像的按钮后,调用不同平台相应的方法,获取用户选择的图片数据,然后将图片裁剪再传给后台保存至特定的目录下.   测试设备是ipad air2,系统版本IOS 8.0.1,点击游戏内的按钮

Android更换皮肤解决方案

Android更换皮肤解决方案 转载请注明出处:IT_xiao小巫 本篇博客要给大家分享的一个关于Android应用换肤的Demo,大家可以到我的github去下载demo,以后博文涉及到的代码均会上传到github中统一管理. github地址:https://github.com/devilWwj/Android-skin-update 思路 换肤功能一般有什么? 元素一般有背景颜色.字体颜色.图片.布局等等 我们知道Android中有主题Theme还有style,theme是针对整个act

Android设置头像,手机拍照或从本地相册选取图片作为头像

 [Android设置头像,手机拍照或从本地相册选取图片作为头像] 像微信.QQ.微博等社交类的APP,通常都有设置头像的功能,设置头像通常有两种方式: 1,让用户通过选择本地相册之类的图片库中已有的图像,裁剪后作为头像. 2,让用户启动手机的相机拍照,拍完照片后裁剪,然后作为头像. 我现在写一个简单的完整代码例子,说明如何在Android中实现上述两个头像设置功能. MainActivity.java文件: package zhangpgil.photo; import java.io.F

Android图片裁剪功能——调用系统裁剪

花了两天时间看了下android的图片裁剪功能的实现.其实刚开始做这个我挺虚的,以为整个功能都需要自己写出来,但查了些资料,发现android已经提供了裁剪功能,需要的话自己调用就成了.soga,这下轻松多了. 首先推荐几篇博客 Android大图片裁剪终极解决方案 要想弄明白裁剪功能,这系列博客非常重要,你可以不看我下面总结的,但你一定要看他这系列的几篇文章. Android 图片裁剪功能实现详解(类似QQ自定义头像裁剪) 这篇也不错,比较喜欢他的注释.虽然也有些误导,比如说他有一段对setD

Android圆形头像图Circle ImageView

<Android圆形头像图Circle ImageView> 需要处理的原始图(pic): 使用CircleImageView处理后的图(作为头像): 现在很多的应用都有设置头像的功能,如QQ.微信.微博等.头像有标准的四方形,也有圆形(如QQ).现在结合他人的代码加以修改,给出一个以原始图形中心为原点,修剪图片为头像的工具类,此类 可以直接在布局文件中加载使用,比如: <RelativeLayout xmlns:android="http://schemas.android.

集成Android免费语音合成功能(在线、离线、离在线融合)

集成Android免费语音合成功能(在线.离线.离在线融合),有这一篇文章就够了(离线)集成Android免费语音合成功能(在线.离线.离在线融合),有这一篇文章就够了(离在线融合) 转眼间,大半年没写文章了,没什么理由,就是人变懒了.囧~ 看标题,其实大家都被骗了,有这一篇文章还不够,我其实是打算分3篇文章来写的,如果合在一章里面就太长了,不过现在这个标题党横行的网络世界,我也被污染了,哈.那么为什么要分3篇文章来讲呢?看标题也能猜到了,就是在线.离线.离在线融合这3种语音合成方式,我将分别使