android - 流式在线音频 - 仅播放第一个音频

标签 android android-mediaplayer

我有两个 Activity :

  1. MediaPlayer_Activity(显示控件,如播放、暂停、停止、下一首....)
  2. MediaPlayerPlayList_Acitivty(显示所有可用歌曲)

我通过加载名为 SongsListArrayList 中的所有歌曲 URL 来流式传输在线音频文件,并一首播放或用户可以从 MediaPlayerPlayList_Acitivty(显示所有歌曲的不同 Activity )并播放任何歌曲...MediaPlayList_Acitivty 正在传递正确的 songIndex,我通过调试代码确认。

问题:它只播放第一首歌曲,即 songIndex(0),无论我从 MediaPlayerPlayList_Acitivty 选择哪首歌曲,它都会播放第一首歌曲。

一旦我从 MediaPlayerPlayList_Acitivty 中选择一首新歌曲,我就会收到我粘贴在下面的错误,并且我还粘贴了我用于此媒体播放器的核心代码。

我花了很多时间调试代码但无济于事。

日志猫:

03-18 07:15:52.338: E/MediaPlayer(998): error (1, -1004)
    03-18 07:15:52.338: W/System.err(998): java.io.IOException: Prepare failed.: status=0x1
    03-18 07:15:52.338: W/System.err(998):  at android.media.MediaPlayer.prepare(Native Method)
    03-18 07:15:52.338: W/System.err(998):  at net.website.player.MediaPlayer_Activity.playSong(MediaPlayer_Activity.java:341)
    03-18 07:15:52.338: W/System.err(998):  at net.website.player.MediaPlayer_Activity.onActivityResult(MediaPlayer_Activity.java:325)
    03-18 07:15:52.338: W/System.err(998):  at android.app.Activity.dispatchActivityResult(Activity.java:3908)
    03-18 07:15:52.338: W/System.err(998):  at android.app.ActivityThread.deliverResults(ActivityThread.java:2528)
    03-18 07:15:52.338: W/System.err(998):  at android.app.ActivityThread.handleSendResult(ActivityThread.java:2574)
    03-18 07:15:52.338: W/System.err(998):  at android.app.ActivityThread.access$2000(ActivityThread.java:117)
    03-18 07:15:52.338: W/System.err(998):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:961)
    03-18 07:15:52.348: W/System.err(998):  at android.os.Handler.dispatchMessage(Handler.java:99)
    03-18 07:15:52.348: W/System.err(998):  at android.os.Looper.loop(Looper.java:123)
    03-18 07:15:52.348: W/System.err(998):  at android.app.ActivityThread.main(ActivityThread.java:3683)
    03-18 07:15:52.348: W/System.err(998):  at java.lang.reflect.Method.invokeNative(Native Method)
    03-18 07:15:52.348: W/System.err(998):  at java.lang.reflect.Method.invoke(Method.java:507)
    03-18 07:15:52.348: W/System.err(998):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
    03-18 07:15:52.348: W/System.err(998):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
    03-18 07:15:52.348: W/System.err(998):  at dalvik.system.NativeStart.main(Native Method)
    03-18 07:15:52.348: E/MediaPlayer(998): Attempt to call getDuration without a valid mediaplayer
    03-18 07:15:52.348: E/MediaPlayer(998): error (-38, 0)
    03-18 07:15:52.458: E/MediaPlayer(998): Error (-38,0)
    03-18 07:15:52.458: D/onCompletion(998): 2
    03-18 07:15:52.458: D/playSong(998): 5
    03-18 07:15:53.058: E/MediaPlayer(998): error (1, -1004)
    03-18 07:15:53.058: W/System.err(998): java.io.IOException: Prepare failed.: status=0x1
    03-18 07:15:53.058: W/System.err(998):  at android.media.MediaPlayer.prepare(Native Method)
    03-18 07:15:53.058: W/System.err(998):  at net.website.player.MediaPlayer_Activity.playSong(MediaPlayer_Activity.java:341)
    03-18 07:15:53.058: W/System.err(998):  at net.website.player.MediaPlayer_Activity.onCompletion(MediaPlayer_Activity.java:449)
    03-18 07:15:53.058: W/System.err(998):  at android.media.MediaPlayer$EventHandler.handleMessage(MediaPlayer.java:1344)
    03-18 07:15:53.058: W/System.err(998):  at android.os.Handler.dispatchMessage(Handler.java:99)
    03-18 07:15:53.058: W/System.err(998):  at android.os.Looper.loop(Looper.java:123)
    03-18 07:15:53.058: W/System.err(998):  at android.app.ActivityThread.main(ActivityThread.java:3683)
    03-18 07:15:53.058: W/System.err(998):  at java.lang.reflect.Method.invokeNative(Native Method)
    03-18 07:15:53.058: W/System.err(998):  at java.lang.reflect.Method.invoke(Method.java:507)
    03-18 07:15:53.058: W/System.err(998):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
    03-18 07:15:53.058: W/System.err(998):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
    03-18 07:15:53.068: W/System.err(998):  at dalvik.system.NativeStart.main(Native Method)
    03-18 07:15:53.218: E/MediaPlayer(998): Attempt to call getDuration without a valid mediaplayer
    03-18 07:15:53.218: E/MediaPlayer(998): error (-38, 0)
    03-18 07:15:53.218: E/MediaPlayer(998): Error (-38,0)
    03-18 07:15:53.218: D/onCompletion(998): 3
    03-18 07:15:53.228: D/playSong(998): 5
    03-18 07:15:53.828: E/MediaPlayer(998): error (1, -1004)
    03-18 07:15:53.828: W/System.err(998): java.io.IOException: Prepare failed.: status=0x1
    03-18 07:15:53.828: W/System.err(998):  at android.media.MediaPlayer.prepare(Native Method)
    03-18 07:15:53.828: W/System.err(998):  at net.website.player.MediaPlayer_Activity.playSong(MediaPlayer_Activity.java:341)
    03-18 07:15:53.828: W/System.err(998):  at net.website.player.MediaPlayer_Activity.onCompletion(MediaPlayer_Activity.java:449)
    03-18 07:15:53.828: W/System.err(998):  at android.media.MediaPlayer$EventHandler.handleMessage(MediaPlayer.java:1344)
    03-18 07:15:53.828: W/System.err(998):  at android.os.Handler.dispatchMessage(Handler.java:99)
    03-18 07:15:53.828: W/System.err(998):  at android.os.Looper.loop(Looper.java:123)
    03-18 07:15:53.828: W/System.err(998):  at android.app.ActivityThread.main(ActivityThread.java:3683)
    03-18 07:15:53.828: W/System.err(998):  at java.lang.reflect.Method.invokeNative(Native Method)
    03-18 07:15:53.828: W/System.err(998):  at java.lang.reflect.Method.invoke(Method.java:507)
    03-18 07:15:53.828: W/System.err(998):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
    03-18 07:15:53.828: W/System.err(998):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
    03-18 07:15:53.828: W/System.err(998):  at dalvik.system.NativeStart.main(Native Method)
    03-18 07:15:53.908: E/MediaPlayer(998): Attempt to call getDuration without a valid mediaplayer
    03-18 07:15:53.908: E/MediaPlayer(998): error (-38, 0)
    03-18 07:15:53.918: E/MediaPlayer(998): Error (-38,0)

代码:

public void onCreate(Bundle savedInstanceState) {
// Mediaplayer
mp = new MediaPlayer();
mp.setOnCompletionListener(this);

mp.setOnPreparedListener(new OnPreparedListener() {
public void onPrepared(MediaPlayer mp) {
    Log.d("onPrepared", "mp.start()");
    mp.start();
    }
});
}

public void onCompletion(MediaPlayer arg0) {
        Log.d("onCompletion", ""+currentSongIndex);
        // check for repeat is ON or OFF
        if(isRepeat){
            // repeat is on play same song again
            playSong(currentSongIndex);
        } else if(isShuffle){
            // shuffle is on - play a random song
            Random rand = new Random();
            currentSongIndex = rand.nextInt((songsList.size() - 1) - 0 + 1) + 0;
            playSong(currentSongIndex);
        } else{
            // no repeat or shuffle ON - play next song
            if(currentSongIndex < (songsList.size() - 1)){
                playSong(currentSongIndex + 1);
                currentSongIndex = currentSongIndex + 1;
            }else{
                // play first song
                playSong(0);
                currentSongIndex = 0;
            }
        }
    } 

public void  playSong(int songIndex){
            // Play song
            //mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
            try {
                Log.d("playSong", ""+ songsList.size());
                mp.reset();
                mp.setDataSource(songsList.get(songIndex).get("audio_url"));
                mp.prepare();
                //mp.start(); //
                // Displaying Song title
                String songTitle = songsList.get(songIndex).get("title_a");
                songTitleLabel.setText(songTitle);

                // Changing Button Image to pause image
                btnPlay.setImageResource(R.drawable.btn_pause);

                // set Progress bar values
                songProgressBar.setProgress(0);
                songProgressBar.setMax(100);

                // Updating progress bar
                 updateProgressBar();       

            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (IllegalStateException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        } 

最佳答案

从堆栈跟踪来看,准备调用似乎由于 java.io.IOException 而失败。数据源 url 是否正确? songsList 列表可能未正确填充?

关于android - 流式在线音频 - 仅播放第一个音频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9756810/

相关文章:

java - 在 list 中设置的 Android 自定义应用程序类不适用于 ClassCastException

Android 应用程序不启动服务

android - 在html5中使用base64数据播放音频

android - 在Android Media Player中循环播放

android - 如何通过中心裁剪和适合宽度/高度来适应动态壁纸中的视频?

android - 像硬件后退按钮一样启用操作栏后退按钮

java - 如何在robotium中获取textview的背景颜色

java - 如何在 WearOS 应用上直接访问互联网

java - Android 从 url 播放 mp3

android - 完成音频后如何再次播放音频?