图片文件位于 RESULT_CANCELED

Picture File on RESULT_CANCELED

我希望能够在使用默认相机玻璃器皿拍摄照片时跟踪图像文件名。这样我就可以在完成后删除它们。我有以下代码:

        ...
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        startActivityForResult(intent, TAKE_PICTURE_REQUEST);
 }

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

        if (requestCode == TAKE_PICTURE_REQUEST && resultCode == RESULT_OK) {

            String imgPath = data.getStringExtra(Intents.EXTRA_PICTURE_FILE_PATH);
            mService.addToImageQueue(imgPath);
        }

        else if (requestCode == TAKE_PICTURE_REQUEST && resultCode == RESULT_CANCELED) {
            ...
        }
  }

如果我点击,resultCode returns RESULT_OK。当我关闭(向下滑动)时,我得到 resultCode RESULT_CANCELED。这就是我打算让它工作的方式,除了它仍然会生成图像文件,即使 resultCode 是 RESULT_CANCELED...老实说,我觉得这可能是一个错误,因为我尝试使用 data.getStringExtra(Intents.EXTRA_PICTURE_FILE_PATH); 并得到了一个NullPointerException。难道我做错了什么?有没有办法在 RESULT_CANCELED 上获取此文件名?

您可以先创建一个临时文件(参见this tutorial中的createImageFile()方法)。如果创建成功,做两件事:

  1. 将此文件的路径保存为字符串。
  2. 在 intent extra 中包含此文件的 URI (putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile)))。

如果 resultCode 为 RESULT_CANCELED,您现在可以追溯到临时文件的路径并对其调用 delete()

下面是一些示例代码:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_TAKE_PHOTO && resultCode == RESULT_OK) {
        Log.v("MainActivity", "Result successful.");
    } else if (requestCode == REQUEST_TAKE_PHOTO && resultCode == RESULT_CANCELED) {
        Log.v(TAG, "Result canceled. Uri of file is " + mCurrentPhotoPath);
        File file = new File(mCurrentPhotoPath);
        if (file.exists()) {
            Log.v(TAG, "File exists.");
            if(file.delete()) {
                 Log.v(TAG, "File was successfully deleted!");
            } else {
                 Log.v(TAG, "File not successfully deleted.");
            }
        } else {
            Log.v(TAG, "File does not exist!");
        }


    }
}

注意:要使 new File(mCurrentPhotoPath) 生效,请从 mCurrentPhotoPath 的开头删除 "file:"。