私はバックグラウンドミュージックを再生するアプリを開発しています。音楽はバックグラウンドで実行されるサービスによって管理されます。主な活動での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();
}
});
しかし、動作しませんでしたが。助言がありますか?ありがとうございました。
mp.prepare()はどこですか?またはmp.prepareAsync()? – CodeCody
これは、mediaPlayer.start()の前に、playMusic()メソッド内で実装されました。 – flagg327
投稿したコードには表示されません。 – CodeCody