我使用 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();
怎么了?為什么它不起作用?
uj5u.com熱心網友回復:
這似乎是 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 在 2.1 上拋出“Prepare failed.: status=0x1”,適用于 2.2
https://forum.processing.org/two/discussion/6722/andriod-mediaplayer-prepare-failed-status-0x1
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/341580.html
上一篇:如何創建一個observable來表示其他兩個observable的完成?
下一篇:如何更改在回圈內宣告的變數?
