安卓获取相册照片和获取拍照照片


这篇博客的目的不是为了拿到最后那个Bitmap,而是拿到图片的路径。因为每个项目的需求不尽相同,获取到了路径就可以进行按比例缩放显示、上传等等操作。


原本以下代码都在同一个类,为了方便新手阅读,我按功能区分出来。Demo我就不上传了,下面代码粘贴后用一个Button加一个ImageView就搞定了。


前言:我们先添加权限

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>


一、从相册获取图片

    //图库请求码
    private static final int REQUESTCODE_ALBUM = 1001;
    //图片地址
    private String photoPath = null;
    /* 从相册中获取照片 */
    private void getPictureFromAlbum() {
        Intent openphotoIntent = new Intent(Intent.ACTION_PICK,
                MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        startActivityForResult(openphotoIntent, REQUESTCODE_ALBUM);
    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode != RESULT_OK) {
            return;
        }
        switch (requestCode) {
            case REQUESTCODE_ALBUM:
		        //获取图片路径
                Uri selectedImage = data.getData();
		        String[] filePathColumns = {MediaStore.Images.Media.DATA};
		        Cursor c = getContentResolver().query(selectedImage, filePathColumns, null, null, null);
		        c.moveToFirst();
		        int columnIndex = c.getColumnIndex(filePathColumns[0]);
		        photoPath = c.getString(columnIndex);
		        c.close();
		        //根据路径加载图片
		        Bitmap bm = BitmapFactory.decodeFile(photoPath);
		        mImage.setImageBitmap(bm);
             break;
        }
    }

二、调用相机拍摄照片(第一种方法:获取Bitmap,是缩略图

    //相机请求码
    private static final int REQUESTCODE_CAMERA = 1002;

    /* 从相机中获取照片 */
    private void getPictureFromCamera() {
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        startActivityForResult(intent, REQUESTCODE_CAMERA);
    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode != RESULT_OK) {
            return;
        }
        switch (requestCode) {
           case REQUESTCODE_CAMERA:
                Bundle bundle = data.getExtras();
                Bitmap bitmap = (Bitmap) bundle.get("data");
                mImage.setImageBitmap(bitmap);
           break;
        }
    }

三、调用相机拍摄照片(第二种方法:设置路径,根据路径获取缩略图

    //相机请求码
    private static final int REQUESTCODE_CAMERA = 1002;
    //图片地址
    private String photoPath = null;
    /* 从相机中获取照片 */
    private void getPictureFromCamera() {
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        //存放图片的文件夹,如果不存在,就创建
        String dir = Environment.getExternalStorageDirectory().toString() + "/DCIM/Camera/";
        File file = new File(dir);
        if (!file.exists()) {
            file.mkdirs();
        }
        //返回照片的全路径名
        photoPath = dir + System.currentTimeMillis() + ".jpg";
        File photo = new File(file, photoPath);
        Uri imageUri = Uri.fromFile(photo);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
        startActivityForResult(intent, REQUESTCODE_CAMERA);
    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode != RESULT_OK) {
            return;
        }
        switch (requestCode) {
           case REQUESTCODE_CAMERA:
		        //photoPath就是路径,可以通过路径获取bitmap
                Bitmap bm = BitmapFactory.decodeFile(photoPath);
                mImage.setImageBitmap(bm);
           break;
        }
    }




我们实验后发现,以上代码展示的图片不是太大就是太小。


所以如果以上代码满足不了需求,就要在onActivityResult方法获取到图片地址时,对图片进行相应的处理,比如按比例缩放等。


如果对系统自带裁剪感兴趣也可以在第三种情况的onActivityResult方法调用以下代码,传入getPictureFromCamera方法中的imageUri。可以打开系统自带的剪裁页面,但此方法设置的参数不一定有效,而且很多机型是有问题的。

    private void cropPhoto(Uri uri) {
        Intent intent = new Intent("com.android.camera.action.CROP");
        intent.setDataAndType(uri, "image/*");
        intent.putExtra("crop", "true");
        intent.putExtra("aspectX", 2);  // 宽高比例
        intent.putExtra("aspectY", 1);
        intent.putExtra("outputX", 200);    // 宽高
        intent.putExtra("outputY", 300);
        intent.putExtra("scale", true); //缩放,不会显示黑边
        intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
        intent.putExtra("return-data", true);
        intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
        intent.putExtra("noFaceDetection", true);
        startActivityForResult(intent, REQUESTCODE_CROP);
    }



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值