很多应用都会有自定义头像的功能,所以头像修改是一个非常常见,而且非常常用的功能。今天就来记录一下照相上传头像和相册选择头像。
转载时请标明出处:http://blog.csdn.net/Bingsman/article/details/48211509
1.先创建布局,我这创建了两个按钮和一个显示头片的imageView,代码如下:
<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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignRight="@+id/button1"
android:layout_below="@+id/button1"
android:layout_marginTop="38dp"
android:text="相册" />
<ImageView
android:id="@+id/imageView1"
android:layout_width="188dip"
android:layout_height="188dip"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="14dp"
android:src="@drawable/ic_launcher" />
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/imageView1"
android:layout_centerHorizontal="true"
android:text="相机" />
</RelativeLayout>
2.开始代码的逻辑,代码如下
package com.example.headportrait;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
public class MainActivity extends Activity implements OnClickListener {
/**
* @author Bingsman
*/
private ImageView imageView;
private Button button_camera;
private Button button_album;
// 请求码
private static int CAMERA_REQUEST_CODE = 1;
private static int ALBUM_REQUEST_CODE = 2;
private static int CROP_REQUEST_CODE = 3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initId();
}
public void initId() {
imageView = (ImageView) MainActivity.this.findViewById(R.id.imageView1);
button_camera = (Button) MainActivity.this.findViewById(R.id.button1);
button_album = (Button) MainActivity.this.findViewById(R.id.button2);
// 不要忘记添加点击的监听
button_camera.setOnClickListener(this);
button_album.setOnClickListener(this);
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
// 拍照获取头像
case R.id.button1:
// 打开照相机
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// 传值所需的code码
startActivityForResult(intent, CAMERA_REQUEST_CODE);
break;
// 图库中获取头像
case R.id.button2:
// 打开一个内容选择的界面
Intent intent2 = new Intent(Intent.ACTION_GET_CONTENT);
// 设置选择的类型为图片
intent2.setType("image/*");
startActivityForResult(intent2, ALBUM_REQUEST_CODE);
break;
default:
break;
}
}
// 照相界面返回的代码
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
// 看看是不是我们拍照是发出的请求码,是就进行拍照的处理
if (requestCode == CAMERA_REQUEST_CODE) {
// 看他当时的操作,是确定还是取消,根据返回的数据是不是为空进行判断
if (data == null) {
return;
} else {
// 从data中获取数据
Bundle bundle = data.getExtras();
if (bundle != null) {
// 用bitmap装载图片
Bitmap bm = bundle.getParcelable("data");
Uri uri = saveBitmap(bm);
// imageView.setImageBitmap(bm);
openImageZoom(uri);// 裁剪所需要的Uri是File类型的Uri,所以……
}
}
} else if (requestCode == ALBUM_REQUEST_CODE) {
// 是否选择了一张照片进行判断
if (data == null) {
return;
} else {
// 当以这种方式返回的data数据将会包含一个Uri,并且Uri的类型是content,需要将其转化成file类型的
Uri uri;
uri = data.getData();
// imageView.setImageURI(convertUri(uri));
Uri fileuri = convertUri(uri);
openImageZoom(fileuri);
}
} else if (requestCode == CROP_REQUEST_CODE) {
// 是否选择了一张照片进行判断
if (data == null) {
return;
} else {
Bundle bundle = data.getExtras();
Bitmap bm = bundle.getParcelable("data");
imageView.setImageBitmap(bm);
}
}
}
// 转换Uri,content类型将其转化成file类型的
private Uri convertUri(Uri uri) {
// 定义一个InputStream
InputStream is = null;
try {
// 现在将content类型的数据转换成了Bitmap-->然后再将Bitmap转换成file类型的Uri
is = getContentResolver().openInputStream(uri);
// 将数据流转换成bitmap
Bitmap bitmap = BitmapFactory.decodeStream(is);
is.close();
return saveBitmap(bitmap);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
// 将bitmap的数据类型保存到SD卡中
private Uri saveBitmap(Bitmap bitmap) {
// 定义保存路径
File path = new File(Environment.getExternalStorageDirectory()
+ "/bsman");
// 如何该文件夹不存在,就创建一个该路径
if (!path.exists()) {
path.mkdir();
}
// 定义保存图像的路径
File img = new File(path.getAbsolutePath() + "bsman.jpg");
// 获取该文件的输出流
try {
FileOutputStream fos = new FileOutputStream(img);
// 将其压缩1.压缩的格式,2压缩的质量,3压缩的数据流
bitmap.compress(Bitmap.CompressFormat.JPEG, 88, fos);
fos.flush();// 刷新
fos.close();// 关闭
// 以上已解决将bitmap类型的文件存到了内存,之后将其转换成Uri并返回
return Uri.fromFile(img);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
// 创建图像裁剪函数
private void openImageZoom(Uri uri) {
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*"); // 同时设置数据与类型
intent.putExtra("crop", true);// 显示的View是可裁剪的
intent.putExtra("aspectx", 1);// 设置裁剪的比例1:1
intent.putExtra("aspecty", 1);
intent.putExtra("outputX", 150);// 裁剪的宽和高
intent.putExtra("outputX", 150);
intent.putExtra("return-data", true);// 裁剪的数据是已intent的返回回来的
startActivityForResult(intent, CROP_REQUEST_CODE);
}
}
3.访问相册的时候别忘了,添加访问权限
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
说明全代码中,一目了然,再接再厉
**
源码下载地址:
**http://download.csdn.net/detail/bingsman/9078375,赚点积分手打费劲,不喜勿喷,谢谢合作