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);
        }