Android调用系统相机onActivityResult返回参数data为null

一般调用系统相机的代码:

filePath = ImageUtil.getCacheFilePath(this, StaticValue.PHOTO_PROTOCOL_ENTRUST);
File file = new File(filePath);
Intent intentFromCapture = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intentFromCapture.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
startActivityForResult(intentFromCapture, CAMERA_ENTURST_PHOTO_REQ_CODE);

在OnActivityResult回调的时候发现intetn的data值为null。如果企图通过data取值就会崩溃,

查看相关资料,Android调用相机相关源码:

得出在手动指定了uri之后,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) { //如果指定了uri
    OutputStream outputStream = null;  
    try {  
        outputStream = mContentResolver.openOutputStream(mSaveUri);  
        outputStream.write(data);  
        outputStream.close();  
  
        setResult(RESULT_OK);  //只返回结果,不返回data数据
        finish();  
    } catch (IOException ex) {  
        // ignore exception  
    } finally {  
        Util.closeSilently(outputStream);  
    }  
} else { //默认情况不指定uri,会把data塞进result回调
    Bitmap bitmap = createCaptureBitmap(data);  
    setResult(RESULT_OK, new Intent("inline-data").putExtra("data", bitmap));  
    finish();  
}  
解决办法:
①不指定uri,即,

Intent intentFromCapture = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intentFromCapture, CAMERA_ENTURST_PHOTO_REQ_CODE);
使用系统默认的uri路径。此时data不为空。
可以在data里面取得相应的数据,

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    switch (requestCode) {
        case CAMERA_ENTURST_PHOTO_REQ_CODE:
            if (resultCode == RESULT_OK) {
                if (data != null) {
                    if(data.hasExtra("data")){
                        Bitmap bitmap = data.getParcelableExtra("data");
                    }
                }
            }
            break;
    }
}
②如文章开头指定uri,将图片路径定义全局,不使用data获取先关数据。(推荐)
 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
" + e); // 整数测试 MyInteger f = new MyInteger(); System.out.print("请输入整数 fAndroid调用系统相机返回通常是因为没有正确处理相机返回的结果。在调用系统相机之 的值:"); value = input.nextLine(); f.setValue(value); System.out.println("f = " + f); MyInteger g = new MyInteger(); System.out.print("请输入整数 g 的值:"); value = input.nextLine(); g前,需要使用`startActivityForResult()`方法启动相机,并在`onActivityResult()`方法中处理相机返回的结果。 .setValue(value); System.out.println("g = " + g); MyInteger h = (MyInteger) f.add(g); System以下是一个示例代码: ``` private static final int REQUEST_IMAGE_CAPTURE = 1; private void dispatchTakePictureIntent() { .out.println("f + g = " + h); MyInteger i = (MyInteger) f.subtract(g); System.out.println(" Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); if (takePictureIntent.resolveActivity(getPackageManager()) != null) { f - g = " + i); if (f.compareTo(g) > 0) { System.out.println("f > g"); startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { } else if (f.compareTo(g) < 0) { System.out.println("f < g"); } else { System.out.println("f = g"); } MyNaturalNumbers j = g.toMyNaturalNumber(); System.out.println("j = if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) { // 处理相机返回的结果 Bundle extras = " + j); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值