Android文件路径(Xamarin)

Android文件路径(Xamarin),android,android-intent,xamarin,Android,Android Intent,Xamarin,我目前正试图选择一个有意图的文件。我的问题是,返回的路径格式不正确 我的意图: private void selectAudioFile(object sender, EventArgs eventArgs) { Intent = new Intent(); Intent.SetType("audio/*"); Intent.SetAction(Intent.ActionGetContent); StartActivityForResult(Intent.Crea

我目前正试图选择一个有意图的文件。我的问题是,返回的路径格式不正确

我的意图:

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之类的文件处理的格式获取此文件的路径


感谢您的帮助

您得到的uri可能看起来像一条路径,但实际上不是,它更像是数据库记录的快捷方式

要检索真正的路径非常麻烦,您必须使用ContentResolver,以下是如何检索它(基于):

您还可以添加其他Android.Provider.MediaStore.Audio.Media.InterfaceConsts.XXX值以获取有关该文件的更多信息

++

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