2017-02-17 69 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