android - 安卓新手问题,调用系统照相功能,在调用裁剪功能,然后显示图片。

查看:102
本文介绍了android - 安卓新手问题,调用系统照相功能,在调用裁剪功能,然后显示图片。的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

运行环境是SDK:23。
一个简单的拍照DEMO,拍完照,跳转到系统裁剪界面,裁剪保存完毕后,并显示。
但是,我在SD卡目录下,发现该文件output_image.jpg是0字节
**我简单的测试了一下,就是,当我不去调用系统的裁剪功能,照片确实是存在的。
但是一旦调用系统裁剪功能,却发现变成了0字节。**
不知道是不是逻辑代码错了,麻烦大神看一下。
权限<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
变量:private Uri imageUri;

//跳转到拍照,逻辑代码如下:
takePhoto.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                File outputImage = new File(Environment.getExternalStorageDirectory(), "output_image.jpg");
                try {
                    if (outputImage.exists()) {
                        outputImage.delete();
                    }
                    outputImage.createNewFile();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                imageUri = Uri.fromFile(outputImage);
                Intent i = new Intent("android.media.action.IMAGE_CAPTURE");
                i.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
                startActivityForResult(i, TAKE_PHOTO);
            }
        });

//回调函数,先是拍完照后,返回TAKE_PHOTO。
//然后再跳转到裁剪界面,返回CROP_PHOTO,并显示图片
 switch (requestCode) {

            case TAKE_PHOTO:
                if (resultCode == RESULT_OK) {
                    Intent i = new Intent("com.android.camera.action.CROP");
                    i.setDataAndType(imageUri, "image/*");
                    i.putExtra("scale", true);
                    i.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
                    startActivityForResult(i, CROP_PHOTO);
                }
                break;
            case CROP_PHOTO:
                if (resultCode == RESULT_OK) {
                    try {
                        Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri));
                        photo.setImageBitmap(bitmap);
                    } catch (FileNotFoundException e) {
                        e.printStackTrace();
                    }
                }
                break;
        }



解决方案

我尝试了下,你的代码在4.4的机器是运行正常,但是在5.0以上会出现你所说的问题。
既然在拍照时能保存正确的图片,那么问题就肯定出现在裁切的地方。这点上面两个答案都注意到了,但是问题的关键是,裁切时返回的resultCode==0也就是说裁切没有正常执行。你可以断点看看,你在resultCode == RESULT_OK里的代码是没有走的。
我注意到你在拍照和裁切这整个过程中只使用了一个uri,我觉得这是问题的关键。
在裁切时,你必须指定一个图片的uri,这点你做到了;但是你必须为裁切应用指定一个空的文件uri,裁切后的图片将保存到这里空的uri里。5.0之前没有这个要求,但是在5.0之后,这是必须的。你的代码中给的uri是要裁切的图片,所以裁切失败,返回的resultCode==0
我给你改了改,按照如下的代码,能够解决问题。你看看内存卡中,应该是由裁切后的图片的:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    Uri croUri;
    switch (requestCode) {
        case TAKE_PHOTO:
            if (resultCode == RESULT_OK) {
                File cropImage = new File(Environment.getExternalStorageDirectory(), "o_crop_image.jpg");
                try {
                    if (cropImage.exists()) {
                        cropImage.delete();
                    }
                    cropImage.createNewFile();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                cropUri = Uri.fromFile(cropImage);

                Intent i = new Intent("com.android.camera.action.CROP");
                i.setDataAndType(imageUri, "image/*");
                i.putExtra("scale", true);
                i.putExtra(MediaStore.EXTRA_OUTPUT, cropUri);
                startActivityForResult(i, CROP_PHOTO);
            }
            break;
        case CROP_PHOTO:
            if (resultCode == RESULT_OK) { 
                    Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri));
                    photo.setImageBitmap(bitmap);
            }
            break;
    }
    
    

我测试了下,在SD中能找到裁切后的图片的。

这篇关于android - 安卓新手问题,调用系统照相功能,在调用裁剪功能,然后显示图片。的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆