title: Get Path from another app (WhatsApp)
body: <p>I'm not getting Path from image or video from uri that I receive from whatsApp.</p>
  
  <p>Uri comes like this: content://com.whatsapp.provider.media/item/16695</p>
  
  <p>Media coming from Gallery, Downloads ands others are fine. </p>
  
  <p>Anyone know how to get Path? This is the code I'm using:</p>
  
  <pre><code>public String getMediaPath(Context context, Uri uri) {
  
      if (DEBUG)
          Log.d(TAG + " File -",
                  "Authority: " + uri.getAuthority() +
                          ", Fragment: " + uri.getFragment() +
                          ", Port: " + uri.getPort() +
                          ", Query: " + uri.getQuery() +
                          ", Scheme: " + uri.getScheme() +
                          ", Host: " + uri.getHost() +
                          ", Segments: " + uri.getPathSegments().toString()
          );
  
      // DocumentProvider
      if (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];
              }
  
  
          }
          // 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;
  
  }
  
  public String getDataColumn(Context context, Uri uri, String selection,
                              String[] selectionArgs) {
  
      Cursor cursor = null;
      final String[] column = { MediaStore.Images.Media.DATA };
      final String[] projection = {
              column[0]
      };
  
      try {
          cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs,
                  null);
          if (cursor != null &amp;&amp; cursor.moveToFirst()) {
              if (DEBUG)
                  DatabaseUtils.dumpCursor(cursor);
  
              final int index = cursor.getColumnIndexOrThrow(column[0]);
              return cursor.getString(index);
          }
      } finally {
          if (cursor != null)
              cursor.close();
      }
      return null;
  }
  
  public static boolean isExternalStorageDocument(Uri uri) {
      return "com.android.externalstorage.documents".equals(uri.getAuthority());
  }
  
  public static boolean isDownloadsDocument(Uri uri) {
      return "com.android.providers.downloads.documents".equals(uri.getAuthority());
  }
  
  public static boolean isMediaDocument(Uri uri) {
      return "com.android.providers.media.documents".equals(uri.getAuthority());
  }
  
  public static boolean isGooglePhotosUri(Uri uri) {
      return "com.google.android.apps.photos.contentprovider".equals(uri.getAuthority());
  }
  </code></pre>
  
  <p>The result of this log: </p>
  
  <pre><code>    if (DEBUG)
      Log.d(TAG + " File -",
              "Authority: " + uri.getAuthority() +
                      ", Fragment: " + uri.getFragment() +
                      ", Port: " + uri.getPort() +
                      ", Query: " + uri.getQuery() +
                      ", Scheme: " + uri.getScheme() +
                      ", Host: " + uri.getHost() +
                      ", Segments: " + uri.getPathSegments().toString()
      );
  </code></pre>
  
  <p>is this: </p>
  
  <pre><code>Authority: com.whatsapp.provider.media, Fragment: null, Port: -1, Query: null, Scheme: content, Host: com.whatsapp.provider.media, Segments: [item, 16348]
  </code></pre>
  
  <p>And the cursor on getDataColumn looks like this:</p>
  
  <pre><code>&gt;&gt;&gt;&gt;&gt; Dumping cursor 
  android.content.ContentResolver$CursorWrapperInner@1fc81ac
  I/System.out: 0 {
  I/System.out: }
  I/System.out: &lt;&lt;&lt;&lt;&lt;
  </code></pre>