【问题标题】:My audio player on Android doesn't work - Xamarin我在 Android 上的音频播放器无法正常工作 - Xamarin
【发布时间】:2021-12-14 17:01:57
【问题描述】:

我使用 Xamarin 编写 C# Android 应用程序。我写了这段代码:

protected MediaPlayer player;
protected override void OnCreate(Bundle savedInstanceState)
{
    base.OnCreate(savedInstanceState);
    SetContentView(Resource.Layout.layout1);
    this.Window.AddFlags(WindowManagerFlags.Fullscreen);

    player = new MediaPlayer();
    player.Reset();
    var fileDescriptor = Assets.OpenFd("MySound.mp3");
    player.SetDataSource(fileDescriptor.FileDescriptor);
    player.Prepare();
    player.Start();
}

MySound.mp3 文件直接位于 Assets 文件夹中。当我运行应用程序时出现错误:

Java.IO.IOException 消息=准备失败。:状态=0x1

player.Prepare();一致

怎么了?为什么它不起作用?

【问题讨论】:

    标签: c# android xamarin audio


    【解决方案1】:

    这似乎是 Android 设备上 MediaPlayer.Prepare() 的常见异常。快速搜索一下:

    https://social.msdn.microsoft.com/Forums/en-US/15f9c371-1b8d-4927-9555-f40e2829c377/mediaplayer-prepare-failed-stauts0x1?forum=xamarinandroid

    匿名引用:

    您好,我浪费了很多时间,试图找到解决此问题的方法 我这边也是。所以我在这里发帖,以防万一它对某些人有所帮助。 我的情况:我想从我的资产中加载一个音频文件(所以不是 在我的资源中注册)。我正在使用与 Ike Nwaogu 类似的代码, 除了我使用 AssetFileDescriptor 打开我的文件(在我的 活动类代码,所以我可以访问“资产”):

    string path = "Audio/myfile.ogg";
    Android.Content.Res.AssetFileDescriptor afd = Assets.OpenFd(path);
    MediaPlayer soundPlayer = new MediaPlayer();
     
    if (afd != null)
    {
        soundPlayer.Reset();
        soundPlayer.SetDataSource(afd.FileDescriptor);
        soundPlayer.Prepare();
        soundPlayer.Enabled = true;
        afd.Close();
    }
    

    我在 Prepare() 上失败了。我试图添加对外部的访问 存储权限(但它确实有意义,因为它 是直接从我的资产中加载的,我试过以防万一)。

    偶然地,通过在论坛上看到其他人的示例,我添加了 afd.StartOffset, afd.DeclaredLength 的参数:

    soundPlayer.SetDataSource(afd.FileDescriptor, afd.StartOffset, afd.DeclaredLength);

    它奏效了......我不知道它是否只是运气,是否会失败 稍后再或如果 API 中存在错误...

    根据各种来源,在设置DataSource时使用getStartOffset和getLength应该可以解决这个问题:

    player.setDataSource(fileDescriptor.getFileDescriptor(), fileDescriptor.getStartOffset(), fileDescriptor.getLength());
    

    或者,这里还有一些想法: Android MediaPlayer throwing "Prepare failed.: status=0x1" on 2.1, works on 2.2

    https://forum.processing.org/two/discussion/6722/andriod-mediaplayer-prepare-failed-status-0x1

    【讨论】:

    • 哦,是的!那行得通。谢谢你的帮助。
    猜你喜欢
    • 2017-12-28
    • 2021-09-23
    • 1970-01-01
    • 1970-01-01
    • 2021-05-07
    • 1970-01-01
    • 2016-12-03
    • 2016-08-16
    • 1970-01-01
    相关资源
    最近更新 更多