1、头像上传
头像上传是应用开发过程中非常常见的一个问题,一般涉及到用户注册的应用,都会有头像上传这样的一个功能,支付宝、QQ、微信、微博等等应用,都有这样一个功能。主要是作为用户识别使用,有时候看头像便一目了然是谁,同时也是增强用户体验的一种方式。
2、选取图片
选取图片有两种方式,第一是直接从相册选取,第二是拍照选取,这里的代码如下:
/*
* 从相册获取
*/
public static void gallery(Activity mActivity,int action) {
// 激活系统图库,选择一张图片
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("image/*");
mActivity.startActivityForResult(intent, action);
}
/*
* 从相机获取
*/
public static void camera(Activity mActivity,int action,String fileName) {
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
// 判断存储卡是否可以用,可用进行存储
if (hasSdcard()) {
intent.putExtra(MediaStore.EXTRA_OUTPUT,
Uri.fromFile(new File(Environment
.getExternalStorageDirectory(), fileName)));
}
mActivity.startActivityForResult(intent, action);
}
3、剪裁图片
剪裁图片也可以说是两种,也可以说是一种,一般我们可以调用系统的剪裁方法,或者是自己实现一个头像剪裁的方法。对于小团队的开发来说,还是尽量使用系统的剪裁方法吧。不过使用系统的剪裁方法,会有一个问题,那就是机型的适配,有些定制的系统,对原生的系统做过剪裁,这样会导致部分功能不能使用,笔者这里就被坑了一把,主要是小米系统和华为系统出现这样的问题。
好,不多说,看看代码:
/**
* 剪切图片
*
* @function:
* @author:Jerry
* @date:2013-12-30
* @param uri
*/
public static void cropImage(Activity mActivity, int action, Uri uri) {
// 裁剪图片意图
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
intent.putExtra("crop", "true");
// 裁剪框的比例,1:1
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
// 裁剪后输出图片的尺寸大小
intent.putExtra("outputX", 250);
intent.putExtra("outputY", 250);
// 图片格式
intent.putExtra("outputFormat", "JPEG");
intent.putExtra("noFaceDetection", true);// 取消人脸识别
intent.putExtra("return-data", true);// true:不返回uri,false:返回uri
// 按照需求拉伸
intent.putExtra("scale",true);
intent.putExtra("scaleUpIfNeeded", true);
mActivity.startActivityForResult(intent, action);
}
4、头像保存
剪裁完了头像,会使用一个暂时的地方缓存起来,不过系统的剪裁会帮我们处理了这个问题。这里的头像保存,主要是指的在拍照时候的图像保存,用来暂时存储拍照获得的头像。这里会判断一下是否有存储卡,代码如下:
/**
* 是否有存储卡
* @return
*/
public static boolean hasSdcard() {
if (Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
return true;
} else {
return false;
}
}
根据URI获取头像地址,代码如下:
/**
* 根据Uri地址,获取图片的地址
* @param context
* @param contentUri
* @return
*/
public static String getRealPathFromURI(Context context, Uri contentUri) {
Cursor cursor = null;
try {
String[] proj = { MediaStore.Images.Media.DATA };
cursor = context.getContentResolver().query(contentUri, proj, null, null, null);
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
} finally {
if (cursor != null) {
cursor.close();
}
}
}
5、剪裁回调
在调用相册、拍照或者头像剪裁的时候,需要使用回调,传递数据到调用者上,代码如下:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == PHOTO_REQUEST_GALLERY) {
if (data != null) {
// 得到图片的全路径
Uri uri = data.getData();
PopWindowUtils.cropImage(SettingActivity.this, PHOTO_REQUEST_CUT, uri);
}
} else if (requestCode == PHOTO_REQUEST_CAMERA) {
if (PopWindowUtils.hasSdcard()) {
tempFile = new File(Environment.getExternalStorageDirectory(),
PHOTO_FILE_NAME);
PopWindowUtils.cropImage(SettingActivity.this, PHOTO_REQUEST_CUT, Uri.fromFile(tempFile));
} else {
Toast.makeText(SettingActivity.this, getString(R.string.toast_infos_setting_photo), Toast.LENGTH_SHORT).show();
}
} else if (requestCode == PHOTO_REQUEST_CUT) {
// 这里已经成功得到了了图片信息
delCropImage(data);
}
super.onActivityResult(requestCode, resultCode, data);
}
/**
* 处理成功获得的截图
* @param data
*/
private void delCropImage(Intent data) {
try {
Uri imageUri = data.getData();
// 如果uri为空,表示放在data中在
if (imageUri == null){
Bundle bundle = data.getExtras();
Bitmap bitmap = (Bitmap)bundle.getParcelable("data");
FilesUtils.saveBitmap(bitmap);
// uploadUserIcon(FilesUtils.mImageFile);
} else {
String imagePath = PopWindowUtils.getRealPathFromURI(SettingActivity.this, imageUri);
FilesUtils.mImageFile = new File(imagePath);
// uploadUserIcon(FilesUtils.mImageFile);
}
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(SettingActivity.this, "抱歉,无法获取到图片信息,请换一台手机重试!", Toast.LENGTH_SHORT).show();
}
}