title: Proper way to get file path when it's picked using ACTION_GET_CONTENT
body: <p>I have a file picker implemented in my app like this:</p>
  
  <pre><code>Intent intent = new Intent();
  intent.setType("*/*");
  intent.setAction(Intent.ACTION_GET_CONTENT);
  startActivityForResult(Intent.createChooser(intent, "Title"), FILE_PICK);
  </code></pre>
  
  <p>It's a known issue that you can't easily get the actual file location this way because Intent will return some weird Uri that you can't really use to create a File object.</p>
  
  <p>I'm using this method to get the actual File path:</p>
  
  <pre><code>/**
   * Get a file path from a Uri. This will get the the path for Storage Access
   * Framework Documents, as well as the _data field for the MediaStore and
   * other file-based ContentProviders.
   *
   * @param context The context.
   * @param uri The Uri to query.
   * @author paulburke
   */
  public static String getPath(final Context context, final Uri uri) {
  
      final boolean isKitKat = Build.VERSION.SDK_INT &gt;= Build.VERSION_CODES.KITKAT;
  
      // DocumentProvider
      if (isKitKat &amp;&amp; DocumentsContract.isDocumentUri(context, uri)) {
          // ExternalStorageProvider
          if (isExternalStorageDocument(uri)) {
              final String docId = DocumentsContract.getDocumentId(uri);
              final String[] split = docId.split(":");
              final String type = split[0];
  
              if ("primary".equalsIgnoreCase(type)) {
                  return Environment.getExternalStorageDirectory() + "/" + split[1];
              }
  
              // TODO handle non-primary volumes
          }
          // DownloadsProvider
          else if (isDownloadsDocument(uri)) {
  
              final String id = DocumentsContract.getDocumentId(uri);
              final Uri contentUri = ContentUris.withAppendedId(
                      Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));
  
              return getDataColumn(context, contentUri, null, null);
          }
          // MediaProvider
          else if (isMediaDocument(uri)) {
              final String docId = DocumentsContract.getDocumentId(uri);
              final String[] split = docId.split(":");
              final String type = split[0];
  
              Uri contentUri = null;
              if ("image".equals(type)) {
                  contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
              } else if ("video".equals(type)) {
                  contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
              } else if ("audio".equals(type)) {
                  contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
              }
  
              final String selection = "_id=?";
              final String[] selectionArgs = new String[] {
                      split[1]
              };
  
              return getDataColumn(context, contentUri, selection, selectionArgs);
          }
      }
      // MediaStore (and general)
      else if ("content".equalsIgnoreCase(uri.getScheme())) {
  
          // Return the remote address
          if (isGooglePhotosUri(uri))
              return uri.getLastPathSegment();
  
          return getDataColumn(context, uri, null, null);
      }
      // File
      else if ("file".equalsIgnoreCase(uri.getScheme())) {
          return uri.getPath();
      }
  
      return null;
  }
  </code></pre>
  
  <p>This works for some files, and for some not. Right now I noticed that it doesn't work when I pick a file from "Downloads" folder. It skips all if statements above and returns null.</p>
  
  <p>What would be the correct way, that would be more reliable to get the actual selected File path?</p>