我正在尝试创建一个活动,其布局中只有一个按钮,按下时会暂停或恢复音乐。问题是,当按下它以恢复音乐时,它会重新启动音频文件。有没有想过如何从停止的最后一点开始播放而不是重新启动它?
主要活动
public class MainActivity extends Activity implements OnClickListener {
private Boolean isMusicPlaying;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
View musicButton = findViewById(R.id.music_button);
musicButton.setOnClickListener(this);
startService(new Intent(getBaseContext(), MusicService.class));
isMusicPlaying = true;
}
@Override
public void onClick(View v) {
if (v.getId() == R.id.music_button)
if (isMusicPlaying) stopService(new Intent(getBaseContext(),
MusicService.class));
else startService(new Intent(getBaseContext(), MusicService.class));
isMusicPlaying = !isMusicPlaying;
}
}
服务类
public class MusicService extends Service {
MediaPlayer player;
@Override
public IBinder onBind(Intent arg0) {
return null;
}
public void onCreate() {
super.onCreate();
player = MediaPlayer.create(this, R.raw.song);
player.setLooping(true); // Set looping
player.setVolume(100, 100);
}
public int onStartCommand(Intent intent, int flags, int startId) {
player.start();
return START_STICKY;
}
@Override
public void onDestroy() {
player.pause();
}
}
答案 0 :(得分:1)
当您停止服务时,似乎不保留您服务中的MediaPlayer对象。 在停止服务之前,您可以使用getCurrentPosition()方法获取歌曲的当前位置,
player.pause();
currentPos = player.getCurrentPosition();
并在停止之前将此值发送回活动。
然后,您可以使用seekTo(int)方法在播放前移动到指定的时间位置。
player.seekTo(currentPos);
player.start();
对于您的服务和活动之间的通信,您可以注册broadcastreceiver并使用意图进行通信或使用bound service。
更新: 我找到了以下教程,你最好遵循这个。这是关于使用MediaPlayer的服务。 特别是,初始化MediaPlayer时,根本不使用prepare方法。把这些行:
player.setOnPreparedListener(this);
player.prepareAsync();
并添加监听器:
public void onPrepared(MediaPlayer player) {
player.start();
}
http://developer.android.com/guide/topics/media/mediaplayer.html#mpandservices
答案 1 :(得分:0)
看到活动重新开始,为什么不将状态保存到共享首选项