onActivityResult对于Image Capture返回null数据

10
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    filePath = getOutputMediaFile(FileColumns.MEDIA_TYPE_IMAGE);
    File file = new File(filePath);
    Uri output = Uri.fromFile(file);
    Intent i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
    i.putExtra(MediaStore.EXTRA_OUTPUT, output);
    startActivityForResult(i, RETURN_FILE_PATH);
}

    @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    //data is always null here.
    //requestCode = RETURN_FILE_PATH;
    //resultCode = Activity.RESULT_OK;
}

我检查了fileoutput Uri的值,两者都没问题,捕获的图像实际上存在于该位置

但是,即使在捕获图像后,onActivityResult返回的数据始终为null

编辑:

我检查了这个问题:

onActivityResult returns with data = null

其中说:

每当通过相机意图传递EXTRAOUTPUT保存图像时,在onActivityResult中的数据参数始终返回null。因此,使用文件路径而不是数据来检索图像。

也许那个解决方案对我有用。但是,我的上述代码在同一场景下一直是有效的。

5个回答

20
根据这篇文章的说法,在预先插入一个URI时,数据为null。这意味着你已经在这里定义了你的输出URI:
  i.putExtra(MediaStore.EXTRA_OUTPUT, output);

当您得到一个Activity.RESULT_OK时,只需通过其已知的URL加载所拍摄的照片。


是的,我刚看到那篇帖子。但是同样的代码过去6个月一直都能正常运行,为什么现在突然出现这种情况呢 :( - Archie.bpgc
1
很遗憾,我不是这个主题的专家,但我猜测它与硬件相关的设备特定功能有关。这篇帖子提到三星设备上有不同的行为:https://dev59.com/UGsy5IYBdhLWcg3w4yDc - alex

1
尝试使用这段代码,对我来说它是有效的。
else if(requestCode == Constant.PICK_FROM_CAMERA)
            {

                if (resultCode == Activity.RESULT_OK) 
                {
                    if(data!=null)
                    {
                        mImageCaptureUri = data.getData();
                        //path= mImageCaptureUri.getPath();
                        try
                        {
                            path = getPath(mImageCaptureUri,Wonderlistpage.this); //from Gallery
                        }
                        catch(Exception e)
                        {
                            path = mImageCaptureUri.getPath();
                            Log.i("check image attach or not", e.toString());
                        }

                        String arr[] = path.split("/");
                        int i;
                        String k = null;
                        for(i=0;i<arr.length;i++)
                        {
                            k=arr[i];       
                        }
                        photoname="_"+String.valueOf(System.currentTimeMillis()) +k;
                         if(setprofileimage_sendimagewithmessage==1)
                         {
                             performCrop(mImageCaptureUri);
                         }
                         else
                         {
                              loading_details="CAMERA";
                              new performBackgroundTask33().execute();
                         }
                    }
                    else
                    {
file1  = new File(Environment.getExternalStorageDirectory(),
                                    String.valueOf(System.currentTimeMillis()) + "_FromCamera.jpg");

                        Uri mImageCaptureUri = Uri.fromFile(file1);
                        try
                        {
                            path = getPath(mImageCaptureUri,Wonderlistpage.this); //from Gallery
                        }
                        catch(Exception e)
                        {
                            path = mImageCaptureUri.getPath();
                            Log.i("check image attach or not", e.toString());
                        }
                        String arr[] = path.split("/");
                        int i;
                        String k = null;
                        for(i=0;i<arr.length;i++)
                        {
                            k=arr[i];       
                        }
                        photoname="_"+String.valueOf(System.currentTimeMillis()) +k;
                         if(setprofileimage_sendimagewithmessage==1)
                         {
                             performCrop(mImageCaptureUri);
                         }
                         else
                         {
                              loading_details="CAMERA";
                              new performBackgroundTask33().execute();
                         }

                    }

                    //new UploadTask().execute();
                }
            }

1
尝试以下代码。
        {
            final String[] imageColumns = { MediaStore.Images.Media._ID,MediaStore.Images.Media.DATA };

            final String imageOrderBy = MediaStore.Images.Media._ID + " DESC";
            Cursor imageCursor = managedQuery(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, imageColumns, null, null, imageOrderBy);
            imageCursor.moveToFirst();
            do {
                String fullPath = imageCursor.getString(imageCursor.getColumnIndex(MediaStore.Images.Media.DATA));
                if (fullPath.contains("DCIM")) {

                    //get bitmap from fullpath here.
                    return;
                }
            }
            while (imageCursor.moveToNext());

0

将此代码放入您的onActivityResult中即可。我在某些设备上遇到了同样的问题,这解决了我的问题。希望这也能帮助到您。

try {

    Uri selectedImage = output;

    if (selectedImage == null)
        return;

    String[] filePathColumn = { MediaStore.Images.Media.DATA };
    Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null);
    cursor.moveToFirst();
    int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
    String picturePath = cursor.getString(columnIndex);
    cursor.close();

} catch (Exception e) {
    return;
}     

您将在picturePath变量中获取图片路径,以及在selectedImage变量中获取Uri。


0
如果您的活动在清单中具有singleInstance启动模式,则会遇到此问题。尝试更改它,因为它会每次取消结果。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接