Android中的支持拍照和选择本地相册的图片选择器

一款支持本地相册选取和拍照上传的图片选择器,之前在项目中也有用到,今天就把我自己写的图片选择器分享给大家:
一如往常,先贴出一张效果图

接下来是实现步骤:
步骤一:首先需要在配置清单中声明相应的权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
步骤二:定义好在什么地方需要弹出的窗口以及弹出的内容,我这个地方用的是在屏幕下方弹出一个如下图的PopupWindow。
步骤三:开始对每一个需要监听的地方进行监听
/**
 * 按钮的点击监听
 */
private class ButtonListener implements View.OnClickListener {
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.but_image:
                InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
                if (imm.isActive()) {
                    imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
                }
                if (mPopupWindowDialog != null) {
                    mPopupWindowDialog.showAtLocation(findViewById(R.id.but_image), Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 0, 0);
                }
                break;
            case R.id.textview_dialog_take_picture:// 拍照
                getImageFromCamera();
                dismPopupWindowDialog();
                break;
            case R.id.textview_dialog_album:// 相册
                dismPopupWindowDialog();
                putPhoto();
                break;
            case R.id.textview_dialog_cancel: // 取消
                dismPopupWindowDialog();
                break;
        }
    }
}
对每一个方法进行相应的处理,举个拍照的例子:使用startActivityForResult的启动方式来处理回传数据,
/**
 * 拍照
 */
protected void getImageFromCamera() {
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    Uri uri = Uri.fromFile(new File(tempPath));
    intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
    startActivityForResult(intent, REQUEST_CODE_CAPTURE_CAMEIA);
}
然后在onActivityResult中去处理回传的数据:
BitmapFactory.Options option = new BitmapFactory.Options();
option.inJustDecodeBounds = true;// 如果设置为true,则解码器将返回null(无位图),但是out ...字段仍将被设置,允许调用者查询位图,而不必为其像素分配内存
Bitmap bitmap = BitmapFactory.decodeFile(tempPath, option);
option.inJustDecodeBounds = false;
option.inSampleSize = 4;//如果设置为值> 1,请求解码器对原始图像进行子采样,返回较小的图像以节省内存。
bitmap = BitmapFactory.decodeFile(tempPath, option);
bmpList.add(bitmap);//添加进集合里
showPrevious();//在对应的控件里面显示
到这里获取一张拍照上传的图片就基本完善了,最后是获取到需要上传的图片然后查看大图,这个地方需要对临时的Imageview进行点击监听
// iv1的点击事件
private View.OnClickListener imageView1_click = new View.OnClickListener() {
    @Override
    public void onClick(View arg0) {
        Intent intent = new Intent();
        intent.putExtra("index", 1);
        BitmapUtil.getInstance().setBitmap(bmpList.get(0));//获取集合里面的对象
        intent.setClass(MainActivity.this, ImageDetailActivity.class);
        startActivityForResult(intent, PICTER_DEAL);
    }
};
然后在详情的activity里面去这样处理图片,注意这个地方需要把XML文件中ImageView控件的类型设置为centerCrop
@SuppressLint("NewApi")
public void loadImg() {
    Intent intent = getIntent();
    index = intent.getIntExtra("index", 0);
    Bitmap bitmap = BitmapUtil.getInstance().getBitmap();
    if (bitmap != null) iv.setBackground(new BitmapDrawable(bitmap));
}
这个地方一个完整的拍照上传的图片选择器就处理完了,最后贴上源代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值