android调用系统相机和相册,图片裁剪

本文介绍了一种在Android应用中实现图片选择的功能,包括从相机拍摄和从相册选取图片的方法。此外,还提供了图片裁剪的实现细节,如裁剪比例、尺寸等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(final View view) {
                    final AlertDialog.Builder builder = new AlertDialog.Builder(
                            SendMessageActivity.this);
                    builder.setTitle("选择照片");

                    builder.setPositiveButton("相机",
                            new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
                                    startActivityForResult(intent, 0);
                                }
                            });
                    builder.setNegativeButton("相册",
                            new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                                    startActivityForResult(intent, 1);
                                }
                            });
                    AlertDialog alert = builder.create();
                    alert.show();
                }
            });
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

        ContentResolver resolver = getContentResolver();

        if (data != null) {
            /**
             * 因为两种方式都用到了startActivityForResult方法,这个方法执行完后都会执行onActivityResult方法
             * , 所以为了区别到底选择了那个方式获取图片要进行判断
             * ,这里的requestCode跟startActivityForResult里面第二个参数对应 1== 相册 0 ==相机
             */
            if (requestCode == 1) {

                try {
                    // 获得图片的uri
                    Uri originalUri = data.getData();
                    //将图片内容解析成字节数组
                    byte[] bytes = readStream(resolver.openInputStream(Uri.parse(originalUri.toString())));
                    //将字节数组转为Bitmap
                    Bitmap myBitmap = getPicFromBytes(bytes, null);
                    imageView.setScaleType(ImageView.ScaleType.FIT_XY);
                    imageView.setImageBitmap(myBitmap);
                } catch (Exception e) {
                    Log.e("----->", e.getMessage());
                }

            } else if (requestCode == 0) {

                Bundle bundle = data.getExtras();
                // 获取相机返回的数据,并转换为Bitmap图片格式
                Bitmap bitmap = (Bitmap) bundle.get("data");
                imageView.setScaleType(ImageView.ScaleType.FIT_XY);
                imageView.setImageBitmap(bitmap);

            }else if(requestCode == 2){
                //TODO 得到裁剪的图片,爱干啥,干啥去吧
            }
        }
    }

    public static Bitmap getPicFromBytes(byte[] bytes, BitmapFactory.Options opts) {
        if (bytes != null)
            if (opts != null)
                return BitmapFactory.decodeByteArray(bytes, 0, bytes.length, opts);
            else
                return BitmapFactory.decodeByteArray(bytes, 0, bytes.length);

        return null;
    }

    public static byte[] readStream(InputStream inStream) throws Exception {
        byte[] buffer = new byte[1024];
        int len = -1;
        ByteArrayOutputStream outStream = new ByteArrayOutputStream();
        while ((len = inStream.read(buffer)) != -1) {

            outStream.write(buffer, 0, len);
        }
        byte[] data = outStream.toByteArray();
        outStream.close();
        inStream.close();
        return data;

    }

    //将uri转化为file
    private File uriToFile(Uri uri) {
        File file = null;
        String[] proj = {MediaStore.Images.Media.DATA};
        Cursor actualimagecursor = managedQuery(uri, proj, null,
                null, null);
        int actual_image_column_index = actualimagecursor
                .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        actualimagecursor.moveToFirst();
        String img_path = actualimagecursor
                .getString(actual_image_column_index);
        file = new File(img_path);
        return file;
    }
/**
     * 裁剪图片
     */
    private void cutPhoto(Uri uri) {

        Intent intent = new Intent("com.android.camera.action.CROP");
        // 设置裁剪
        intent.setDataAndType(uri, "image/*");
        intent.putExtra("crop", "true");
        // aspectX aspectY 是宽高的比例
        intent.putExtra("aspectX", 1);
        intent.putExtra("aspectY", 1);
        // outputX outputY 是裁剪图片宽高
        intent.putExtra("outputX", 340);
        intent.putExtra("outputY", 340);
        intent.putExtra("return-data", true);
        startActivityForResult(intent, 2);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值