2

押されたときに音楽を一時停止または再開するボタンをレイアウトに 1 つ含むアクティビティを作成しようとしています。問題は、音楽を再開するために押すと、オーディオファイルが最初からやり直されることです。再起動するのではなく、最後に停止したポイントから再生する方法はありますか?

主な活動

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();
    }
}
4

2 に答える 2

1

サービスを停止すると、サービスの MediaPlayer オブジェクトが保持されないようです。サービスを停止する前に、 getCurrentPosition() メソッドを使用して曲の現在位置を取得できます。

player.pause();
currentPos = player.getCurrentPosition();

停止する前に、この値をアクティビティに送り返します。

次に、 seekTo(int) メソッドを使用して、再生前に指定された時間位置に移動できます。

player.seekTo(currentPos);
player.start();

サービスとアクティビティ間の通信には、broadcastreceiver を登録してインテントを使用して通信するか、バインドされたサービスを使用します。

更新: 次のチュートリアルが見つかりました。これに従うことをお勧めします。MediaPlayer でサービスを使用することについてです。特に、MediaPlayer を初期化するときに準備メソッドをまったく使用していません。これらの行を入れてください:

player.setOnPreparedListener(this);
player.prepareAsync();

リスナーを追加します。

public void onPrepared(MediaPlayer player) {
    player.start();
}

http://developer.android.com/guide/topics/media/mediaplayer.html#mpandservices

于 2013-10-19T16:20:06.920 に答える