最近在做个通讯录管理软件,需要给联系人和用户设置头像,之前这部分都没有接触过,所以在就找了一些资料和别人的源码看了一下,才大致搞懂了些。好东西不敢独享,所以就发上来和大家share一下。
一、显示选择获取图片的途径的对话框。
通常也就是相册和相机,使用alertdialog就可以了,一些具体的细节在下面代码里面有注释
//显示对话框
private void showPicDialog() {
new AlertDialog.Builder(this)
.setTitle("设置头像")
.setNegativeButton("相册", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// 让对话框消失
dialog.dismiss();
// ACTION_PICK,从数据集合中选择一个返回,官方文档解释如下
// Activity Action:
// Pick an item from the data, returning what was
// selected.
Intent intent = new Intent(Intent.ACTION_PICK, null);
// 设置数据来源和类型
intent.setDataAndType(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
"image/*");
startActivityForResult(intent, ALBUM_REQUEST_CODE);
}
})
.setPositiveButton("拍照", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int arg1) {
dialog.dismiss();
/**
* 下面这句还是老样子,调用快速拍照功能,至于为什么叫快速拍照,大家可以参考如下官方
* 文档,you_sdk_path/docs/guide/topics/media/camera.html
*/
Intent intent = new Intent(
MediaStore.ACTION_IMAGE_CAPTURE);
// 打开图片所在目录,如果该目录不存在,则创建该目录
File dirFile = new File(Constants.ALBUM_PATH);
if (!dirFile.exists()) {
dirFile.mkdirs();
}
// 将图片保存到该目录下
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri
.fromFile(new File(Constants.ALBUM_PATH,
"tmpuser.jpg")));
startActivityForResult(intent, CAMERA_REQUEST_CODE);
}
}).show();
}二、获取到图片之后,会调用onActivityResult方法来处理结果
// 处理从其他Activity返回的数据
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.v(TAG, "requestCode:" + requestCode);
if (resultCode == RESULT_OK) {
switch (requestCode) {
// 从相册返回
case ALBUM_REQUEST_CODE:
startPhotoZoom(data.getData());
break;
// 从相机返回
case CAMERA_REQUEST_CODE:
File tmp = new File(Constants.ALBUM_PATH + "tmpuser.jpg");
startPhotoZoom(Uri.fromFile(tmp));
break;
// 从裁剪后返回
case CROP_REQUEST_CODE:
if (data != null) {
setPicToView(data);
}
break;
default:
break;
}
}三、对获取到图片进行裁剪,是指满足自己的需要
/**
* 将图片裁剪
*
* @param uri
* 图片的uri地址
*/
private void startPhotoZoom(Uri uri) {
Log.v(TAG, "Zoom:" + uri.toString());
/*
* 至于下面这个Intent的ACTION是怎么知道的,大家可以看下自己路径下的如下网页
* yourself_sdk_path/docs/reference/android/content/Intent.html
*/
Intent intent = new Intent("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 是裁剪图片宽高
intent.putExtra("outputX", 150);
intent.putExtra("outputY", 150);
intent.putExtra("return-data", true);
startActivityForResult(intent, CROP_REQUEST_CODE);
}四、最后还需要将获取的图片设置到控件上
//将取得的图片设置到控件上
private void setPicToView(Intent data) {
//取得返回的数据
Bundle bundle = data.getExtras();
//不为空则保存图片到本地并设置到控件上
if (bundle != null) {
Bitmap picture = bundle.getParcelable("data");
try {
ImageUtil.saveImage(picture, Constants.ALBUM_PATH, "user.jpg");
} catch (IOException e) {
e.printStackTrace();
}
pictureIBTN.setImageBitmap(picture);
}
}五、这里附加几个将图片读写的方法,大家可以将他们封装成工具类,方便使用
/**
* 获取本地的图片
* @param path 图片所在路径
* @param filename 图片文件名
* @return 图片的bitmap对象
*/
public static Bitmap getLocalBitmap(String path,String filename){
Bitmap bitmap = null;
try
{
File file = new File(path+filename);
if(file.exists())
{
bitmap = BitmapFactory.decodeFile(path+filename);
}
} catch (Exception e)
{
e.printStackTrace();
}
return bitmap;
}
/**
* 保存图片
* @param bitmap 要保存的bitmap图片
* @param path 路径
* @param fileName 文件名
* @param ratio 图片压缩比率
* @throws IOException
*/
public static void saveImage(Bitmap bitmap, String path, String fileName,
int ratio) throws IOException {
File dirFile = new File(path);
if (!dirFile.exists()) {
dirFile.mkdir();
}
File myCaptureFile = new File(path + fileName);
BufferedOutputStream bos = new BufferedOutputStream(
new FileOutputStream(myCaptureFile));
bitmap.compress(Bitmap.CompressFormat.JPEG, ratio, bos);
bos.flush();
bos.close();
}
本文介绍了在Android应用中为联系人和用户设置头像的方法。通过展示如何使用AlertDialog显示选择图片的途径(相册和相机),并提供相关代码细节。

188

被折叠的 条评论
为什么被折叠?



