Как играть в потоковое аудио в фоновом режиме на Android?

У меня есть приложение для Android, которое воспроизводит потоковое аудио из Интернета с помощью класса MediaPlayer.

Как мне позволить продолжить воспроизведение звука на фоне, когда пользователь нажимает кнопку "домой" для запуска других приложений?

При запуске других приложений мне бы хотелось продолжить воспроизведение звука.

Ответ 1

Вы должны использовать что-то, что называется Android Services.

Из документов:

"Служба - это компонент приложения, представляющий либо приложение, желающее выполнить более длительную работу, не взаимодействуя с пользователем, либо предоставляя функциональные возможности для других приложений, которые будут использоваться".

Здесь вы найдете отличное официальное руководство по использованию сервисов для начала работы: http://developer.android.com/guide/components/services.html

Вот хороший учебник по созданию аудиоплеера: http://www.androidhive.info/2012/03/android-building-audio-player-tutorial/

Вот видео-учебник по созданию потокового музыкального плеера: http://www.youtube.com/watch?v=LKL-efbiIAM

Ответ 2

Для воспроизведения медиафайлов в фоновом режиме вам понадобится реализовать Сервис, не привязав его к Activity, который начал воспроизведение. Посмотрите этот пример.

Ответ 3

Ключ определяет Service.START_STICKY, чтобы продолжить воспроизведение в фоновом режиме:

   public int onStartCommand(Intent intent, int flags, int startId) {
        myMediaPlayer.start();
        return Service.START_STICKY;
    }

Service.START_STICKY: если этот сервисный процесс убит, пока он при запуске система попытается заново создать службу.

Это пример этого:

import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;
import android.util.Log;
import android.widget.Toast;

/**
 * Created by jorgesys.
 */

/* Add declaration of this service into the AndroidManifest.xml inside application tag*/

public class BackgroundSoundService extends Service {

    private static final String TAG = "BackgroundSoundService";
    MediaPlayer player;

    public IBinder onBind(Intent arg0) {
        Log.i(TAG, "onBind()" );
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        player = MediaPlayer.create(this, R.raw.jorgesys_song);
        player.setLooping(true); // Set looping
        player.setVolume(100,100);
        Toast.makeText(this, "Service started...", Toast.LENGTH_SHORT).show();
        Log.i(TAG, "onCreate() , service started...");

    }
    public int onStartCommand(Intent intent, int flags, int startId) {
        player.start();
        return Service.START_STICKY;
    }

    public IBinder onUnBind(Intent arg0) {
        Log.i(TAG, "onUnBind()");
        return null;
    }

    public void onStop() {
        Log.i(TAG, "onStop()");
    }
    public void onPause() {
        Log.i(TAG, "onPause()");
    }
    @Override
    public void onDestroy() {
        player.stop();
        player.release();
        Toast.makeText(this, "Service stopped...", Toast.LENGTH_SHORT).show();
        Log.i(TAG, "onCreate() , service stopped...");
    }

    @Override
    public void onLowMemory() {
        Log.i(TAG, "onLowMemory()");
    }
}

Начальная служба:

Intent myService = new Intent(MainActivity.this, BackgroundSoundService.class);
startService(myService);

Остановить службу:

Intent myService = new Intent(MainActivity.this, BackgroundSoundService.class);
stopService(myService);

Полный код этого примера.