好久没有写博客了,感到深深的自责。这是一个以分享为乐的时代,显然这段时间我对不起这个时代了,呵呵。 现在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);
    }