static string ResolveDocumentPath(AndroidUri uri) { Debug.WriteLine($"Trying to resolve document URI: '{uri}'"); var docId = DocumentsContract.GetDocumentId(uri); var docIdParts = docId?.Split(':'); if (docIdParts == null || docIdParts.Length == 0) { return(null); } if (uri.Authority.Equals(UriAuthorityExternalStorage, StringComparison.OrdinalIgnoreCase)) { Debug.WriteLine($"Resolving external storage URI: '{uri}'"); if (docIdParts.Length == 2) { var storageType = docIdParts[0]; var uriPath = docIdParts[1]; // This is the internal "external" memory, NOT the SD Card if (storageType.Equals(storageTypePrimary, StringComparison.OrdinalIgnoreCase)) { #pragma warning disable CS0618 // Type or member is obsolete var root = global::Android.OS.Environment.ExternalStorageDirectory.Path; #pragma warning restore CS0618 // Type or member is obsolete return(Path.Combine(root, uriPath)); } // TODO: support other types, such as actual SD Cards } } else if (uri.Authority.Equals(UriAuthorityDownloads, StringComparison.OrdinalIgnoreCase)) { Debug.WriteLine($"Resolving downloads URI: '{uri}'"); // NOTE: This only really applies to older Android vesions since the privacy changes if (docIdParts.Length == 2) { var storageType = docIdParts[0]; var uriPath = docIdParts[1]; if (storageType.Equals(storageTypeRaw, StringComparison.OrdinalIgnoreCase)) { return(uriPath); } } // ID could be "###" or "msf:###" var fileId = docIdParts.Length == 2 ? docIdParts[1] : docIdParts[0]; foreach (var prefix in contentUriPrefixes) { var uriString = prefix + "/" + fileId; var contentUri = AndroidUri.Parse(uriString); if (GetDataFilePath(contentUri) is string filePath) { return(filePath); } } } else if (uri.Authority.Equals(UriAuthorityMedia, StringComparison.OrdinalIgnoreCase)) { Debug.WriteLine($"Resolving media URI: '{uri}'"); if (docIdParts.Length == 2) { var storageType = docIdParts[0]; var uriPath = docIdParts[1]; AndroidUri contentUri = null; if (storageType.Equals(storageTypeImage, StringComparison.OrdinalIgnoreCase)) { contentUri = MediaStore.Images.Media.ExternalContentUri; } else if (storageType.Equals(storageTypeVideo, StringComparison.OrdinalIgnoreCase)) { contentUri = MediaStore.Video.Media.ExternalContentUri; } else if (storageType.Equals(storageTypeAudio, StringComparison.OrdinalIgnoreCase)) { contentUri = MediaStore.Audio.Media.ExternalContentUri; } if (contentUri != null && GetDataFilePath(contentUri, $"{MediaStore.MediaColumns.Id}=?", new[] { uriPath }) is string filePath) { return(filePath); } } } Debug.WriteLine($"Unable to resolve document URI: '{uri}'"); return(null); }