【解疑答惑】—— Android调用系统相机,onActivityresult()回调接收到data为空

在使用Android系统相机拍照时,遇到onActivityResult()回调中data为空导致应用闪退的问题。原因是设置了MediaStore.EXTRA_OUTPUT参数。解决方法包括:不指定输出路径,通过data获取图片;或者指定输出路径后从指定路径获取图片。

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

昨天调用系统相机拍照制作头像的时候遇到个问题,相机拍完照后返回后直接闪退,那么问题出在哪呢?先看看当时的代码:

Intent cameraIntent = new Intent("android.media.action.IMAGE_CAPTURE");
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT,getImageUri());
cameraIntent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 0);
activity.startActivityForResult(cameraIntent,Constants.CAMERA_REQUEST_CODE);

//onActivityResult回调中,
if (resultCode != RESULT_OK) {resizeImage是裁剪图片
    return;
} else {
     switch (requestCode) {
       case Constants.CAMERA_REQUEST_CODE:
           if (FileUtil.isSdCardExist()) {
SelectPhotoUtil.resizeImage(MyPortraitActivity.this, data.getData());
            } else {
                Toast.makeText(this, "未找到存储卡", Toast.LENGTH_SHORT).show();
                   }
               break;
        }

直接报data为空!!!
这是为什么呢,看一下源码

// First handle the no crop case -- just return the value.  If the
// caller specifies a "save uri" then write the data to it's
// stream. Otherwise, pass back a scaled down version of the bitmap
// directly in the extras.
if (mSaveUri != null) { //存在mSaveUri,即指定了目标uri
    OutputStream outputStream = null;
    try {
        outputStream = mContentResolver.openOutputStream(mSaveUri);
        outputStream.write(data);
        outputStream.close();

        setResult(RESULT_OK);   //直接返回RESULT_OK,并没有指定intent
        finish();
    } catch (IOException ex) {
        // ignore exception
    } finally {
        Util.closeSilently(outputStream);
    }
} else {
    Bitmap bitmap = createCaptureBitmap(data);
    // 返回RESULT_OK,并包含一个Intent对象,其中Extra中科key为data,value为一个bitmap
    setResult(RESULT_OK, new Intent("inline-data").putExtra("data", bitmap));
    finish();
}

也就是说如果指定MediaStore.EXTRA_OUTPUT的uri值返回的data值就是空的,无语。。。。

有什么解决办法呢?

1. 不指定输出路径(MediaStore.EXTRA_OUTPUT),在data中直接获取
2.指定输出路径,回调中直接在在路径中获取图片
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值