2016-04-07 8 views
1

現在、音楽プレーヤーをストリームする簡単なアプリケーションを設計しようとしています。私は歌のURLを持っており、以下のようにMediaPlayerを設定しています。すべては最初の曲でOKですが、私は他の曲を再生するときにエミュレートする場合、プログラムがクラッシュしていないが、何も演奏されていないと、私は次のエラーを取得しています:MediaPlayerエラーコード(-38,0)getDuration

E/MediaPlayer: Attempt to call getDuration without a valid mediaplayer 
E/MediaPlayer: error (-38, 0) 
E/MediaPlayer: Error (-38,0) 

PlayerService.java

public class MusicPlayerService extends Service { 
    private SongItem mSong; 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     mSong = ListSong.getListSong().get(ListSong.getSelectedItem()); 
     registerLocalFilter(); 
     playMedia(); 
     return START_STICKY; 
    } 

    private void playMedia() { 
     if (handler == null) { 
      thread = new Thread(new Runnable() { 
       @Override 
       public void run() { 
        Looper.prepare(); 
        handler = new Handler(); 
        handler.post(playAudioFromURL); 
        Looper.loop(); 
       } 
      }); 
      thread.start(); 
     } else { 
      handler.post(playAudioFromURL); 
     } 
    } 

    private Runnable playAudioFromURL = new Runnable() { 
     @Override 
     public void run() { 
      if (mediaPlayer != null) { 
       mediaPlayer.release(); 
      } 
      mediaPlayer = new MediaPlayer(); 
      mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 
      try { 
       mediaPlayer.setDataSource(mSong.getSongUrl()); 
       mediaPlayer.setOnPreparedListener(onPreparedListener); 
       mediaPlayer.setOnCompletionListener(onCompletionListener); 
       mediaPlayer.setOnSeekCompleteListener(onSeekCompleteListener); 
       mediaPlayer.setOnErrorListener(onErrorListener); 
       mediaPlayer.prepareAsync(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
       Log.w(TAG, "playAudioFromURL: " + e.toString()); 
      } catch (IllegalArgumentException ex) { 
       Log.w(TAG, "playAudioFromURL: " + ex.toString()); 
      } catch (IllegalStateException ex) { 
       Log.w(TAG, "playAudioFromURL: " + ex.toString()); 
      } 
     } 
    }; 


    private MediaPlayer.OnPreparedListener onPreparedListener = new MediaPlayer.OnPreparedListener() { 
     @Override 
     public void onPrepared(MediaPlayer mp) { 
      ListSong.setPlaying(true); 
      sendLoadComplete(); 
      updateTimer(); 
      mp.start(); 
     } 
    }; 
} 

私はonPrepared()での書き込みmp.start()Media Player called in state 0, error (-38,0)で溶液のようなmediaPlayer.prepareAsync();を使用してを持っているが、それは働いていません。

私を助けてください!

答えて

0

mediaPlayer.setDataSource(mSong.getSongUrl()); before MediaPlayer mediaPlayer.reset();あなたの問題を解決する可能性があります。

+0

** may **?それはコメントの仲間にすべきです! – Gattsu