Android Xamarin从Android.Net.Uri获取绝对路径

时间:2017-02-17 14:00:29

标签: c# xamarin xamarin.android

我和Xamarin Android应用程序需要用户从内部存储中获取文件然后读取文件。

我使用的文件选择器将文件作为Android.Net.Uri对象返回。以下是对象的来源:

enter image description here

然后使用System.IO.File.ReadAllBytes(filename)阅读文件。问题是此方法无法找到具有此路径的文件。

我尝试了Path.GetFullPath(uri.Path),但它返回了我传入的相同值。

如何获取此类Uri对象的文件的绝对路径?

此外,该文件可以位于任何文件夹中,而不仅仅是在示例中的Download文件夹中。

1 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,最后在这里找到了一个很好的解决方案:

Xamarin Choose Image From Gallery Path is Null

对我来说,唯一棘手的部分是: a)找到ContentResolver,因为我不是在Activity中,而是在片段中:

this.View.Context.ContentResolver

b)找到ManagedQuery Object,它也是Activity的属性

this.Activity.ManagedQuery

c)提供正确的选择,因为我有来自MediaStore的图像:

string selection = Android.Provider.MediaStore.Images.Media.InterfaceConsts.Id + " =? ";

我希望这对你有帮助,虽然它是2个月前。

private string GetPathToImage(Android.Net.Uri uri) {
    string doc_id = "";
    using (var c1 = this.View.Context.ContentResolver.Query(uri, null, null, null, null)) {
        c1.MoveToFirst();
        String document_id = c1.GetString(0);
        doc_id = document_id.Substring(document_id.LastIndexOf(":") + 1);
    }

    string path = null;

    // The projection contains the columns we want to return in our query.
    string selection = Android.Provider.MediaStore.Images.Media.InterfaceConsts.Id + " =? ";
    using (var cursor = this.Activity.ManagedQuery(Android.Provider.MediaStore.Images.Media.ExternalContentUri, null, selection, new string[] { doc_id }, null)) {
        if (cursor == null) return path;
        var columnIndex = cursor.GetColumnIndexOrThrow(Android.Provider.MediaStore.Images.Media.InterfaceConsts.Data);
        cursor.MoveToFirst();
        path = cursor.GetString(columnIndex);
    }
    return path;
}