【问题标题】:Android Xamarin get absolute path from Android.Net.UriAndroid Xamarin 从 Android.Net.Uri 获取绝对路径
【发布时间】:2017-05-03 23:47:46
【问题描述】:

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

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

然后读取我正在使用的文件System.IO.File.ReadAllBytes(filename)。问题是这个方法找不到这个路径的文件。

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

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

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

【问题讨论】:

  • 你能提供你项目的文件选择器代码吗?
  • 我认为要走的路是:1. File f = new File(Uri); var absp = f.AbsolutePath;

标签: c# xamarin xamarin.android


【解决方案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;
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2022-06-10
  • 2012-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-11
  • 2010-09-21
相关资源
最近更新 更多