Java 如何转换`content://media/external/images/media/Y`到`file:///storage/sdcard0/Pictures/X.jpg`在android中?

Java 如何转换`content://media/external/images/media/Y`到`file:///storage/sdcard0/Pictures/X.jpg`在android中?,java,android,Java,Android,我正在尝试从我的android应用程序将图像上传到Google Drive 基于此 当我调试他们的示例项目时,我看到一个典型的fileUri= file:///storage/sdcard0/Pictures/IMG_20131117_090231.jpg 在我的应用程序中,我想上传一张现有照片 我就这样找到了它的路径 private void GetAnyImage() { File dir = new File(Environment.get

我正在尝试从我的android应用程序将图像上传到Google Drive

基于此

当我调试他们的示例项目时,我看到一个典型的fileUri=

file:///storage/sdcard0/Pictures/IMG_20131117_090231.jpg

在我的应用程序中,我想上传一张现有照片

我就这样找到了它的路径

     private void GetAnyImage()
        {
            File dir = new File(Environment.getExternalStorageDirectory()
            .getAbsolutePath() + "/Pictures/Screenshots"); 
                              // --> /storage/sdcard0/Pictures/Screenshots

            Log.d("File path ", dir.getPath());
            String dirPath=dir.getAbsolutePath();
            if(dir.exists() && dir.isDirectory()) {
                Intent intent = new Intent(Intent.ACTION_GET_CONTENT, null);
                intent.setType("image/*");
                startActivityForResult(intent,REQUEST_ID);
            }  
        }
最终得到这个典型的fileUri=
content://media/external/images/media/74275

但是,当运行这行代码时

  private void saveFileToDrive() {

    //  progressDialog = ProgressDialog.show(this, "", "Loading...");

    Thread t = new Thread(new Runnable() {
      @Override
      public void run() {
        try {
          // File's binary content
          java.io.File fileContent = new java.io.File(fileUri.getPath());
          FileContent mediaContent = new FileContent("image/jpeg", fileContent);

      // File's metadata.
      File body = new File();
      body.setTitle(fileContent.getName());
      body.setMimeType("image/jpeg");

      File file = service.files().insert(body, mediaContent).execute();
我得到一个错误:

java.io.FileNotFoundException:/external/images/media/74275:打开失败:enoint(没有这样的文件或目录)

我怎样才能解决这个问题


如何转换
content://media/external/images/media/Y
file:///storage/sdcard0/Pictures/X.jpg

像这样的东西对你有用吗?这样做的目的是查询内容解析程序以查找为该内容条目存储的文件路径数据

public static String getRealPathFromUri(Context context, Uri contentUri) {
    Cursor cursor = null;
    try {
        String[] proj = { MediaStore.Images.Media.DATA };
        cursor = context.getContentResolver().query(contentUri, proj, null, null, null);
        int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(column_index);
    } finally {
        if (cursor != null) {
            cursor.close();
        }
    }
}

这将最终为您提供一个绝对文件路径,您可以从该路径构建一个文件uri,如果您只需要位图,这同样有效

InputStream inputStream = mContext.getContentResolver().openInputStream(uri);
Bitmap bmp = BitmapFactory.decodeStream(inputStream);
if( inputStream != null ) inputStream.close();

示例uri:content://media/external/images/media/12345

你是如何实现的?这绝对解决了我的问题。但有一个问题是,是否有一个最小或最大API不能使用?也就是说,如果它们是API 24+或低于API 14,这会因为某种原因而不起作用吗?@Silmarilos,不知道,我在几年前为一个项目编写了这段代码,当时情况肯定发生了变化。关于最小级别的兼容性,我们在这里从
MediaStore.Images.Media
搜索的列继承自
MediaStore.MediaColumns
,其中包含
数据定义。它是在API 1中添加的,因此它应该跨平台一致工作。@Selecsosi如果文件是pdf或视频或xls,如何获取路径??Images.Media.DATA已弃用,您有什么解决方案吗@SelecsosiI也有同样的问题,但我在特定的设备上也有,有人知道为什么会这样吗?