Beispiel #1
0
        /// <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);
        }
Beispiel #3
0
        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);
        }
Beispiel #4
0
        /**
         * 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);
        }