我目前正在尝试选择带有Intent的文件。我的问题是,返回的路径格式不正确。
我的意图:
private void selectAudioFile(object sender, EventArgs eventArgs)
{
Intent = new Intent();
Intent.SetType("audio/*");
Intent.SetAction(Intent.ActionGetContent);
StartActivityForResult(Intent.CreateChooser(Intent, "Select Audio File"), PickAudioId);
}
和rusult方法:
protected override void OnActivityResult (int requestCode, Result resultCode, Intent data) {
base.OnActivityResult (requestCode, resultCode, data);
if ((resultCode == Result.Ok) && (requestCode == PickAudioId) && (data != null)) {
Android.Net.Uri uri = data.Data;
if (!File.Exists(uri)) {
// error
}
}
}
问题:
我需要使用 File 类处理收到的路径。路径看起来像 / document / audio:1234 。 如果我使用 File.Exists(uri)检查路径,则表明该文件不存在。
如何以文件处理的格式获取此文件的路径,例如 /storage/emulated/0/Music/foo.mp3 等那个?
感谢您的帮助
答案 0 :(得分:2)
你得到的回报可能看起来像一条道路,但它不是,它更像是数据库记录的快捷方式。
要检索真实路径是非常令人满意的,您必须使用ContentResolver,这里有如何检索它(基于that sample from Xamarin):
protected override void OnActivityResult (int requestCode, Result resultCode, Intent data) {
base.OnActivityResult (requestCode, resultCode, data);
if ((resultCode == Result.Ok) && (requestCode == PickAudioId) && (data != null)) {
string path = GetPathToImage(data.Data);
if (!File.Exists (path)) {
Log.Debug ("","error");
} else {
Log.Debug ("","ok");
}
}
}
private string GetPathToImage(Android.Net.Uri uri)
{
string path = null;
// The projection contains the columns we want to return in our query.
string[] projection = new[] { Android.Provider.MediaStore.Audio.Media.InterfaceConsts.Data };
using (ICursor cursor = ManagedQuery(uri, projection, null, null, null))
{
if (cursor != null)
{
int columnIndex = cursor.GetColumnIndexOrThrow(Android.Provider.MediaStore.Audio.Media.InterfaceConsts.Data);
cursor.MoveToFirst();
path = cursor.GetString(columnIndex);
}
}
return path;
}
您还可以添加其他Android.Provider.MediaStore.Audio.Media.InterfaceConsts.XXX值以获取有关该文件的更多信息
++