2016-09-19 21 views
0

私はバックグラウンドミュージックを再生するアプリを開発しています。音楽はバックグラウンドで実行されるサービスによって管理されます。主な活動でのonCreate()メソッドでは、サービスで始まる、:Android - MediaPlayerエラー

public class MainActivity extends AppCompatActivity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    // Background music service. 
    Intent musicServiceIntent = new Intent(this, BackgroundSoundService.class); 
    startService(musicServiceIntent); 

    final BackgroundSoundService bss = new BackgroundSoundService(); 
    buttonStart = (Button) v.findViewById(R.id.button_start); 
    buttonStart.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      bss.onStart(); 
     } 
    }); 
    buttonPause = (Button) v.findViewById(R.id.button_pause); 
    buttonPause.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      bss.onPause(); 
     } 
    }); 
    buttonStop = (Button) v.findViewById(R.id.button_stop); 
    buttonStop.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       bss.onStop(); 
      } 
     }); 
    } 
} 
} 

サービスは、次のコードです: BackgroundSoundService.java

public class BackgroundSoundService extends Service { 
    private static final String TAG = null; 
    static MediaPlayer mMediaPlayer; 

     @Nullable 
     @Override 
     public IBinder onBind(Intent intent) { 
      return null; 
     } 

     @Override 
     public void onCreate() { 
      super.onCreate(); 

      mMediaPlayer = MediaPlayer.create(getApplicationContext(), R.raw.background_music); 
      mMediaPlayer.setVolume(1.0f, 1.0f); 
      mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
       public void onCompletion(MediaPlayer arg0) { 
        playMusic(); 
       } 
      }); 

      playMusic(); 
     } 

     public void playMusic() { 
      mMediaPlayer.start(); 
     } 

     /** 
     * 
     * @param arg0 - 
     * @return - 
     */ 
     public IBinder onUnBind(Intent arg0) { 
      // TO DO Auto-generated method 
      return null; 
     } 

     /** 
     * 
     */ 
     public void onStart() { 
      Log.d("A", "onStart()"); 
      if(!mMediaPlayer.isPlaying()) { 
       Log.d("A", "mMediaPlayer is not playing"); 
       playMusic(); 

      } else { 
       Log.d("A", "mMediaPlayer is playing"); 
      } 
     } 

     /** 
     * 
     */ 
     public void onPause() { 
      Log.d("A", "onPause()"); 
      if(mMediaPlayer.isPlaying()) { 
       Log.d("A", "mMediaPlayer is playing"); 
       mMediaPlayer.pause(); 
      } else { 
       Log.d("A", "mMediaPlayer is not playing"); 
      } 
     } 

     /** 
     * 
     */ 
     public void onStop() { 
      Log.d("A", "onStop()"); 
      if(mMediaPlayer.isPlaying()) { 
       Log.d("A", "mMediaPlayer is playing"); 
       mMediaPlayer.stop(); 
      } else { 
       Log.d("A", "mMediaPlayer is not playing"); 
      } 
     } 

     /** 
     * 
     */ 
     @Override 
     public void onDestroy() { 
      Log.d("A", "onDestroy()"); 
      mMediaPlayer.stop(); 
      mMediaPlayer.release(); 
     } 

     /** 
     * 
     */ 
     @Override 
     public void onLowMemory() { 

     } 

    } 

さて、MainActivity 3つのボタンがあります音楽をコントロールする。 SARTボタン、音楽を開始、PAUSEボタン、一時停止とSTOPボタンに音を入れ、音楽を停止します。それぞれは、BackgroundSoundService内のonStart()、Pause()およびonStop()のメソッドを実行します。問題は、私はSTOPボタンの後にSTARTボタンを押すと、ログは私にこのエラーを表示します:

E/MediaPlayer: start called in state 0 
E/MediaPlayer: error (-38, 0) 

私はこれが実装解決してみてください。

mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
     @Override 
     public void onPrepared(MediaPlayer mp) { 
      mp.start(); 
     } 
    }); 

しかし、動作しませんでしたが。助言がありますか?ありがとうございました。

+0

mp.prepare()はどこですか?またはmp.prepareAsync()? – CodeCody

+0

これは、mediaPlayer.start()の前に、playMusic()メソッド内で実装されました。 – flagg327

+0

投稿したコードには表示されません。 – CodeCody

答えて

0

投稿MainActivityコードは、ランダムな回答にあなたを逸脱することなく正確な解決策を提供するのに役立ちます。

0

.stop()の後に、再度開始したい場合は、リセットする必要があります。

 public void onStop() { 
       Log.d("A", "onStop()"); 
       if(mMediaPlayer.isPlaying()) { 
        Log.d("A", "mMediaPlayer is playing"); 
      mMediaPlayer.stop(); 
      mMediaPlayer.reset(); 
      mMediaPlayer = MediaPlayer.create(getApplicationContext(), R.raw.background_music); 

       } else { 
        Log.d("A", "mMediaPlayer is not playing"); 
       } 
      } 

EDIT

boolean isPrepared = false; 

mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
     @Override 
     public void onPrepared(MediaPlayer mp) { 
      isPrepared = true; 
     } 
    }); 

public void playMusic() { 
    if(isPrepared){ 
      mMediaPlayer.start(); 
      isPrepared = false; 
    } 
    else{ 
    Toast.makeText(getApplicationContext(),"Not prepared",LENGTH.SHORT) 
    .show(); 
    } 
    } 
+0

動作しませんでした。あなたより。 – flagg327

+0

おそらく、あなたのファイルがあまりにも多くの準備をしているので、onPrepareListener()を実装してフラグを設定してみてください。私の編集された答えを見てください。 – Lazai

0
  1. 代わりのmediaPlayer.createは()、playMusic() OR prepareAsync(内側)
  2. コール(準備()と開始新しいメディアプレーヤを呼び出します)playMusic()内にあり、onPreparedListener()はstart()を呼び出します。
関連する問題