/// <summary> /// Tries to find a file system path for given Uri. Note that this isn't always possible, /// since the content referenced by the Uri may not be stored on a file system, but is /// returned by the responsible app by using a ContentProvider. In this case, the method /// returns null, and access to the content is only possible by opening a stream. /// </summary> /// <param name="context">Android context to access content resolver</param> /// <param name="uri">Uri to use</param> /// <returns>full file system path, or null</returns> public static string GetPath(Context context, Android.Net.Uri uri) { bool isKitKat = Build.VERSION.SdkInt >= BuildVersionCodes.Kitkat; // DocumentProvider if (isKitKat && DocumentsContract.IsDocumentUri(context, uri)) { // ExternalStorageProvider if (IsExternalStorageDocument(uri)) { var docId = DocumentsContract.GetDocumentId(uri); string[] split = docId.Split(':'); var type = split[0]; if ("primary".Equals(type, StringComparison.OrdinalIgnoreCase)) { return(Android.OS.Environment.ExternalStorageDirectory + "/" + split[1]); } // TODO handle non-primary volumes } else if (IsDownloadsDocument(uri)) { // DownloadsProvider string id = DocumentsContract.GetDocumentId(uri); if (!string.IsNullOrEmpty(id) && id.StartsWith("raw:")) { return(id.Substring(4)); } if (!long.TryParse(id, out long parseId)) { return(null); } string[] contentUriPrefixesToTry = new string[] { "content://downloads/public_downloads", "content://downloads/my_downloads" }; foreach (string contentUriPrefix in contentUriPrefixesToTry) { Android.Net.Uri contentUri = ContentUris.WithAppendedId( Android.Net.Uri.Parse(contentUriPrefix), parseId); try { var path = GetDataColumn(context, contentUri, null, null); if (path != null) { return(path); } } catch (Exception) { // ignore exception; path can't be retrieved using ContentResolver } } } else if (IsMediaDocument(uri)) { // MediaProvider var docId = DocumentsContract.GetDocumentId(uri); string[] split = docId.Split(':'); var type = split[0]; Android.Net.Uri contentUri = null; if ("image".Equals(type)) { contentUri = MediaStore.Images.Media.ExternalContentUri; } else if ("video".Equals(type)) { contentUri = MediaStore.Video.Media.ExternalContentUri; } else if ("audio".Equals(type)) { contentUri = MediaStore.Audio.Media.ExternalContentUri; } var selection = "_id=?"; var selectionArgs = new string[] { split[1] }; return(GetDataColumn(context, contentUri, selection, selectionArgs)); } } // MediaStore (and general) if (IsMediaStore(uri.Scheme)) { return(GetDataColumn(context, uri, null, null)); } else if ("file".Equals(uri.Scheme, StringComparison.OrdinalIgnoreCase)) { return(uri.Path); } return(null); }
private string GetPathUri(Android.Net.Uri oUri) { ICursor oImgCursor = null; string sPathUri = null; try { oImgCursor = CrossCurrentActivity.Current.Activity.ContentResolver.Query(oUri, null, null, null); oImgCursor.MoveToFirst(); int iIndex = oImgCursor.GetColumnIndex(MediaStore.Images.ImageColumns.Data); if (iIndex != -1) { //old devices; sPathUri = oImgCursor.GetString(iIndex); } else { //new devices; oImgCursor = null; var oDocId = DocumentsContract.GetDocumentId(oUri); var oDoc = oDocId.Split(":"); var oId = oDoc[1]; var oSelect = MediaStore.Images.ImageColumns.Id + "=?"; var oDataConst = MediaStore.Images.ImageColumns.Data; var oProjections = new string[] { oDataConst }; var oInternalUri = MediaStore.Images.Media.InternalContentUri; var oExternalUri = MediaStore.Images.Media.ExternalContentUri; if (oDoc[0].Equals("video")) { oSelect = MediaStore.Video.VideoColumns.Id + "=?"; oDataConst = MediaStore.Video.VideoColumns.Data; oProjections = new string[] { oDataConst }; } oImgCursor = CrossCurrentActivity.Current.Activity.ContentResolver.Query(oInternalUri, oProjections, oSelect, new string[] { oId }, null); if (oImgCursor.Count == 0) { //not found in internal storage oImgCursor = CrossCurrentActivity.Current.Activity.ContentResolver.Query(oExternalUri, oProjections, oSelect, new string[] { oId }, null); var oColData = oImgCursor.GetColumnIndexOrThrow(oDataConst); oImgCursor.MoveToFirst(); sPathUri = oImgCursor.GetString(oColData); } } } catch (Exception ex) { Toast.MakeText(Xamarin.Forms.Forms.Context, "Error Uri: " + ex.Message.ToString(), ToastLength.Long).Show(); } finally { oImgCursor.Close(); oImgCursor.Dispose(); } return(sPathUri); }
public static string GetPath(Context context, Android.Net.Uri uri) { var isKitKat = Build.VERSION.SdkInt >= BuildVersionCodes.Kitkat; // DocumentProvider if (isKitKat && DocumentsContract.IsDocumentUri(context, uri)) { // ExternalStorageProvider if (IsExternalStorageDocument(uri)) { var docId = DocumentsContract.GetDocumentId(uri); var split = docId.Split(':'); var type = split [0]; if ("primary".Equals(type, StringComparison.OrdinalIgnoreCase)) { return(Android.OS.Environment.ExternalStorageDirectory + "/" + split [1]); } // TODO handle non-primary volumes } // DownloadsProvider else if (IsDownloadsDocument(uri)) { var id = DocumentsContract.GetDocumentId(uri); var contentUri = ContentUris.WithAppendedId( Android.Net.Uri.Parse("content://downloads/public_downloads"), long.Parse(id)); return(GetDataColumn(context, contentUri, null, null)); } // MediaProvider else if (IsMediaDocument(uri)) { var docId = DocumentsContract.GetDocumentId(uri); var split = docId.Split(':'); var type = split [0]; Android.Net.Uri contentUri = null; if ("image".Equals(type)) { contentUri = MediaStore.Images.Media.ExternalContentUri; } else if ("video".Equals(type)) { contentUri = MediaStore.Video.Media.ExternalContentUri; } else if ("audio".Equals(type)) { contentUri = MediaStore.Audio.Media.ExternalContentUri; } const string selection = "_id=?"; var selectionArgs = new[] { split[1] }; return(GetDataColumn(context, contentUri, selection, selectionArgs)); } } // MediaStore (and general) else if ("content".Equals(uri.Scheme, StringComparison.OrdinalIgnoreCase)) { return(GetDataColumn(context, uri, null, null)); } // File else if ("file".Equals(uri.Scheme, StringComparison.OrdinalIgnoreCase)) { return(uri.Path); } return(null); }
/** * Method for return file path of Gallery image * * @param context * @param uri * @return path of the selected image file from gallery */ public static string GetPath(Context context, Android.Net.Uri uri) { //check here to KITKAT or new version bool isKitKat = Build.VERSION.SdkInt >= BuildVersionCodes.Kitkat; // DocumentProvider if (isKitKat && DocumentsContract.IsDocumentUri(context, uri)) { // ExternalStorageProvider if (IsExternalStorageDocument(uri)) { string docId = DocumentsContract.GetDocumentId(uri); string[] split = docId.Split(':'); string type = split[0]; if ("primary".Equals(type, System.StringComparison.OrdinalIgnoreCase)) { return(Android.OS.Environment.ExternalStorageDirectory + "/" + split[1]); } } // DownloadsProvider else if (IsDownloadsDocument(uri)) { string id = DocumentsContract.GetDocumentId(uri); Android.Net.Uri contentUri = ContentUris.WithAppendedId(Android.Net.Uri.Parse("content://downloads/public_downloads"), long.Parse(id)); return(GetDataColumn(context, contentUri, null, null)); } // MediaProvider else if (IsMediaDocument(uri)) { string docId = DocumentsContract.GetDocumentId(uri); string[] split = docId.Split(':'); string type = split[0]; Android.Net.Uri contentUri = null; if ("image".Equals(type)) { contentUri = MediaStore.Images.Media.ExternalContentUri; } else if ("video".Equals(type)) { contentUri = MediaStore.Video.Media.ExternalContentUri; } else if ("audio".Equals(type)) { contentUri = MediaStore.Audio.Media.ExternalContentUri; } string selection = "_id=?"; string[] selectionArgs = new string[] { split[1] }; return(GetDataColumn(context, contentUri, selection, selectionArgs)); } } // MediaStore (and general) else if ("content".Equals(uri.Scheme, System.StringComparison.OrdinalIgnoreCase)) { // Return the remote address if (IsGooglePhotosUri(uri)) { return(uri.LastPathSegment); } if (IsGoogleDocUri(uri)) { return(uri.LastPathSegment); } return(GetDataColumn(context, uri, null, null)); } // File else if ("file".Equals(uri.Scheme, System.StringComparison.OrdinalIgnoreCase)) { if (IsGoogleDocUri(uri)) { return(uri.LastPathSegment); } return(uri.Path); } return(null); }
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); }