Java 获取已保存图像文件的Uri

Java 获取已保存图像文件的Uri,java,android,Java,Android,当我从gallery中选择图像时,我可以获得该图像的Uri,如下所示: @Override protected void onActivityResult(int requestCode, int resultCode, Intent result) { if (requestCode == Crop.REQUEST_PICK && resultCode == RESULT_OK) { Uri uri = result.getData();

当我从gallery中选择图像时,我可以获得该图像的Uri,如下所示:

    @Override
protected void onActivityResult(int requestCode, int resultCode, Intent result) {
    if (requestCode == Crop.REQUEST_PICK && resultCode == RESULT_OK) {
        Uri uri = result.getData();
        beginCrop(uri);
    } else if (requestCode == Crop.REQUEST_CROP) {
        handleCrop(resultCode, result);
    }
}
上面检索到的Uri格式为content://media/external/images/media/7266

但是,当我尝试获取刚保存为文件的图像的Uri时,无法检索此格式的Uri:

Date d = new Date();
            CharSequence s  = DateFormat.format("MM-dd-yy hh-mm-ss", d.getTime());
            Bitmap bitmap = drawView.getResultBitmap();
            File sdCardDirectory = Environment.getExternalStorageDirectory();
            File image = new File(sdCardDirectory, "DCIM/Camera/" + s.toString() + ".png");
            boolean success = false;

            // Encode the file as a PNG image.
            FileOutputStream outStream;
            try {

                outStream = new FileOutputStream(image);
                bitmap.compress(Bitmap.CompressFormat.PNG, 100, outStream);
                    /* 100 to keep full quality of the image */

                outStream.flush();
                outStream.close();
                success = true;
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

            if (success) {
                MediaScannerConnection.scanFile(getActivity(), new String[]{
                                image.getAbsolutePath()},
                        null, new MediaScannerConnection.OnScanCompletedListener() {
                            public void onScanCompleted(String path, Uri uri) {


                            }
                        });

                Uri uri = Uri.parse(image.getAbsolutePath());
                beginCrop(uri);
从上述代码获得的Uri是/storage/emulated/0/DCIM/Camera/02-04-16 12-49-16.png

我相信,这不是正确的Uri格式,而是绝对文件路径。有没有一种方法可以让我以content://media/external/images/media/


非常感谢您的帮助

您可以从位图中获取uri,如下所示:

Uri getUri(Context context, Bitmap bitmap) {
      ByteArrayOutputStream bytes = new ByteArrayOutputStream();
      String path = "";
      try {

          bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
          path = MediaStore.Images.Media.insertImage(
                context.getContentResolver(), bitmap, "Title", null);
    } catch (Exception e) {

    }
    return Uri.parse(path);
}

您可以从位图中获取uri,如下所示:

Uri getUri(Context context, Bitmap bitmap) {
      ByteArrayOutputStream bytes = new ByteArrayOutputStream();
      String path = "";
      try {

          bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
          path = MediaStore.Images.Media.insertImage(
                context.getContentResolver(), bitmap, "Title", null);
    } catch (Exception e) {

    }
    return Uri.parse(path);
}
我相信,这不是正确的Uri格式,而是绝对文件路径

你说得对。使用
Uri.fromFile()
文件
转换为指向该文件的
Uri

有没有一种方法可以让我以这种格式获取Uricontent://media/external/images/media/ ?

不容易。充其量,在
onScanCompleted()
中,您可以运行一些查询来获取
MediaStore
使用的
Uri
。但是,在此之前,
MediaStore
不知道该文件

Uri.fromFile()
获取的
Uri
是有效的
Uri
,但它将具有
文件
方案,而不是
内容
方案

我相信,这不是正确的Uri格式,而是绝对文件路径

你说得对。使用
Uri.fromFile()
文件
转换为指向该文件的
Uri

有没有一种方法可以让我以这种格式获取Uricontent://media/external/images/media/ ?

不容易。充其量,在
onScanCompleted()
中,您可以运行一些查询来获取
MediaStore
使用的
Uri
。但是,在此之前,
MediaStore
不知道该文件


Uri.fromFile()
获得的
Uri
是有效的
Uri
,但它将有一个
文件
方案,而不是
内容
方案。

这不回答问题。这不回答问题。