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

б) найти ManagedQuery объект, который также является свойством активности

this.Activity.ManagedQuery 

с) обеспечить правильный выбор, так как у меня был образ он был из 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

Смежные вопросы