2017-02-17 104 views
2

我有和Xamarin Android应用程序需要用户从内部存储获取文件然后读取文件。Android Xamarin从Android.Net获取绝对路径.Uri

我正在使用的文件选取器将该文件作为Android.Net.Uri对象返回。这里的对象是如何来:

enter image description here

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

我试图Path.GetFullPath(uri.Path)但它返回我传递相同的值。

我怎样才能得到文件的这种Uri对象的绝对路径?

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

+0

您能否提供项目的文件选取器代码? –

+0

我想要走的路是:'1。文件f =新文件(Uri); var absp = f.AbsolutePath;' – Pierre

回答

1

我有同样的问题,终于找到了一个很好的解决办法在这里:

Xamarin Choose Image From Gallery Path is Null

我唯一棘手的部分是: 一)找到ContentResolver的,因为我在一个活动是没有,可是在一个片段:

this.View.Context.ContentResolver 

b)中找到ManagedQuery对象,这也是活动的属性

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; 
} 
+0

它表示'ManagedQuery'行不推荐使用,你可能有新的查询方式吗? – Pierre

+1

https://stackoverflow.com/questions/12714701/deprecated-managedquery-issue看看这里,我认为this.Activity.ContentResolver.Query应该是正确的替代 - https://stackoverflow.com/a/26120999/ 464016 – Lepidopteron