我有 Xamarin Android 应用程序需要用户从内部存储中获取文件然后读取文件。
我正在使用的文件选择器将文件作为 Android.Net.Uri
对象返回。对象是这样来的:
然后我使用 System.IO.File.ReadAllBytes(filename)
读取文件。问题是此方法找不到具有此路径的文件。
我尝试了 Path.GetFullPath(uri.Path)
但它返回的值与我传入的值相同。
如何获取此类 Uri
对象的文件的绝对路径?
此外,该文件可以位于任何文件夹中,而不仅仅是示例中的 Download
文件夹中。
最佳答案
我遇到了同样的问题,终于在这里找到了一个很好的解决方法:
Xamarin Choose Image From Gallery Path is Null
对我来说唯一棘手的部分是: a) 找到 ContentResolver,因为我不在 Activity 中,而是在片段中:
this.View.Context.ContentResolver
b) 找到 ManagedQuery 对象,它也是 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;
}
关于c# - Android Xamarin 从 Android.Net.Uri 获取绝对路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42299799/