好久没有写博客了,感到深深的自责。这是一个以分享为乐的时代,显然这段时间我对不起这个时代了,呵呵。 现在Android市场上app的数量越来越多了,这就要求我们在开发软件和版本迭代也要快(如外包公司和创业公司就需要快速拿出产品和简单的demo原型)。 现在大多数的软件在使用时需要用户注册账号设置个人信息,而设置用户的头像是必不可少的,我们的项目也用到了这个功能。
效果图如下:
有图有真相,下面是真相:
###首先调系统的拍照和从相册选择图片的界面
public static final int TAKE_PICTURE_REQUEST_CODE = 7;
public static final int CHOOSE_PICTURE_REQUEST_CODE = 23;
//拍照
public static void gotoTakePicture(Activity activity, String takePicturePath) {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
Uri uri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(), takePicturePath));
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
activity.startActivityForResult(intent, TAKE_PICTURE_REQUEST_CODE);
}
//从相册选择
public static void gotoChoosePicture(Activity activity) {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
activity.startActivityForResult(intent, CHOOSE_PICTURE_REQUEST_CODE);
}
###在相应的界面下处理返回的数据,onActivityResult()方法中处理
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
switch (requestCode) {
case NavigateManager.TAKE_PICTURE_REQUEST_CODE:
imagePath = Environment.getExternalStorageDirectory() + takePicturePath;
setImageViewWithPath(civUserAvatar, imagePath);
break;
case NavigateManager.CHOOSE_PICTURE_REQUEST_CODE:
Uri uri = data.getData();
if (uri != null) {
String[] proj = {MediaStore.Images.Media.DATA};
Cursor cursor = getContentResolver().query(uri, proj, null, null, null);
if (cursor != null && cursor.moveToFirst()) {
imagePath = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA));
setImageViewWithPath(civUserAvatar, imagePath);
cursor.close();
}
}
break;
}
}
}
###这就完了吗?显然还没有,图片显示也考验着软件的性能,原来我自己处理返回的图片并转换为Bitmap再缩放,可偶尔还是会出现OutOfMemoryError,这样还是有风险的。 想想为甚要重新造轮子,用现在开源的ImageLoader可以安全轻松搞定。
private void setImageViewWithPath(ImageView imageView, String imagePath) {
DisplayImageOptions imageOptions = new DisplayImageOptions.Builder().cacheInMemory(true).cacheOnDisc(true)
.showImageOnLoading(R.drawable.ic_user)
.showImageForEmptyUri(R.drawable.ic_user)
.showImageOnFail(R.drawable.ic_user)
.build();
ImageLoader.getInstance().displayImage("file://" + imagePath, imageView, imageOptions);
}