android - 如何从文件选择的 Intent 中获取非空数据?

标签 android file android-intent xamarin.android

我想让用户选择一个音频文件,然后我想获取它的文件路径。但是我有更简单的问题,因为我得到的 Intent 的 Uri 为空。我怎样才能得到一些有意义的东西,即非空?

起始 Intent :

    private void MainActivity_Click1(object sender, System.EventArgs e)
    {
        //var intent = new Intent();
        var intent = new Intent(Intent.ActionPick, Android.Provider.MediaStore.Audio.Media.ExternalContentUri);

        intent.SetType("audio/*");
        intent.SetAction(Intent.ActionGetContent);
        StartActivityForResult(
            Intent.CreateChooser(intent, "Select audio file"), SelectAudioCode);
    }

并响应选择:

    protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
    {
        base.OnActivityResult(requestCode, resultCode, data);

        if (resultCode == Result.Ok && requestCode==SelectAudioCode)
        {
            Android.Net.Uri uri = Intent.Data;
            audioFileNameText.Text = uri == null ? "<NULL>" : uri.ToString();
        }
    }

无论我如何创建 Intent (请参阅上面的代码),我总是看到NULL

更新:如果我使用通过参数传递的Intent,则其Data属性为null,如下所示好吧。

最佳答案

I would like to let user select an audio file, and then I would like to get the file path of it. However I have even simpler problem, because Uri of the intent I get is null.

您可以从data.Data获取内容Uri。但如果你想从content uri中获取文件路径,则需要将content uri转换为真实路径:

protected override void OnActivityResult(int requestCode, [GeneratedEnum] Result resultCode, Intent data)
{
    base.OnActivityResult(requestCode, resultCode, data);
    string abc= getRealPathFromURI(this,data.Data);
}


public string getRealPathFromURI(Context context, Uri contentUri)
{
    ICursor cursor = null;
    try
    {
        string[] proj = { MediaStore.Audio.AudioColumns.Data};
        cursor = ContentResolver.Query(contentUri, proj, null, null, null);
        int column_index = cursor.GetColumnIndexOrThrow(MediaStore.Audio.AudioColumns.Data);
        cursor.MoveToFirst();
        return cursor.GetString(column_index);
    }
    finally
    {
        if (cursor != null)
        {
            cursor.Close();
        }
    }
}

解释更新:

您当前使用的 Intent.Data Intent 是启动当前 Activity 的 Intent ,而不是选择器返回的 Intent :

enter image description here

因此,您需要使用选择器 Activity 返回的intent,而不是使用Intent.Data,它是data参数:

enter image description here

关于android - 如何从文件选择的 Intent 中获取非空数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41912120/

相关文章:

java - 手持设备无法连接到 GoogleApiClient

python - 无法使用 python : incomplete parsing of text file 解析文本 block

android - 在 Android Wear 上播放 res/raw 中的视频

Android:为什么点击 backstack 的 Intent 通知会破坏父 MainActivity?

android - 共享意向位置

java - 如何将 HttpUrlConnection 的逻辑拆分为多个方法?

WebView 中的 Android +1 按钮

android - 在 windows 平台上使用 libVLC for Android

android - 在外部存储器上保存数据

android - 如何在不要求用户在浏览器或应用程序之间做出决定的情况下从链接打开应用程序,只需立即打开我的应用程序