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就会为空。

  1. // First handle the no crop case -- just return the value.  If the  
  2. // caller specifies a "save uri" then write the data to it's  
  3. // stream. Otherwise, pass back a scaled down version of the bitmap  
  4. // directly in the extras.  
  5. if (mSaveUri != null) { //如果指定了uri
  6.     OutputStream outputStream = null;  
  7.     try {  
  8.         outputStream = mContentResolver.openOutputStream(mSaveUri);  
  9.         outputStream.write(data);  
  10.         outputStream.close();  
  11.   
  12.         setResult(RESULT_OK);  //只返回结果,不返回data数据
  13.         finish();  
  14.     } catch (IOException ex) {  
  15.         // ignore exception  
  16.     } finally {  
  17.         Util.closeSilently(outputStream);  
  18.     }  
  19. else { //默认情况不指定uri,会把data塞进result回调
  20.     Bitmap bitmap = createCaptureBitmap(data);  
  21.     setResult(RESULT_OK, new Intent("inline-data").putExtra("data", bitmap));  
  22.     finish();  
  23. }  
解决办法:

①不指定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获取先关数据。(推荐)




你可能感兴趣的:(Android)