当应用程序在安卓后台运行时,继续播放流媒体音频



im 构建一个应用程序以通过 WiFi 流式传输直播广播。我遇到的问题是,当用户最小化应用程序时,如何保持应用程序播放?

private void initializeMediaPlayer() {

player = new MediaPlayer();
try {
    player.setDataSource("url");
} catch (IllegalArgumentException e) {
    e.printStackTrace();
} catch (IllegalStateException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}
player.setOnBufferingUpdateListener(new OnBufferingUpdateListener() {
    public void onBufferingUpdate(MediaPlayer mp, int percent) {
       // playSeekBar.setSecondaryProgress(percent);
        Log.i("Buffering", "" + percent);
    }
});
}

你需要研究Service s。当应用程序最小化时,它们会让您在后台执行操作。

当您的应用最小化时,您可以制作一个Intent,向您Service描述要流式传输的内容以及从什么时间开始。然后,Service将构建一个MediaPlayer并继续流式传输。此外,一个好主意是有一个Notification,让用户在不打开应用程序的情况下结束此Service

另一个条件是当用户在Service播放一段时间后最大化应用时。在这种情况下,您需要一个持久性机制来跟踪。喜欢SharedPreferencesSQLite.

文档:http://developer.android.com/guide/components/services.html

您必须将媒体播放器实现为服务,因为活动在最小化时将处于停止状态。

public class MyMediaPlayerService extends Service implements MediaPlayer.OnPreparedListener,MediaPlayer.OnCompletionListener,AudioManager.OnAudioFocusChangeListener {

    static MediaPlayer mPlayer = null;

    public MyMediaPlayerService() {
    }
    public int onStartCommand(Intent intent, int flags, int startId) {

        if (mPlayer != null && mPlayer.isPlaying()) {
            mPlayer.stop();
            mPlayer.release();
            mPlayer = null;
            mPlayer = new MediaPlayer();

        }



        mPlayer = new MediaPlayer();
        try {
            mPlayer.setDataSource(intent.getStringExtra("streamurl"));
            mPlayer.setLooping(true);
        } catch (IOException e) {
            e.printStackTrace();
        }

        mPlayer.setOnPreparedListener(this);
// Request audio focus for playback

            mPlayer.prepareAsync();

        mPlayer.setLooping(false);
        mPlayer.setOnCompletionListener(this);
        notification();

        return START_NOT_STICKY;
    }

实时无线电流,无论 UI 如何,它都是长时间运行的过程,因此您需要在服务中实现完整的媒体播放器逻辑,并且您的服务将承担流式传输的所有费用。根据 UI 而言,您用于表示流数据的任何 UI 组件都可以与你将实现的服务进行通信。

关于开始和停止流式传输,这将取决于您的应用程序设计。我认为这种方法将对所有预期的应用程序设计开放。

如果您需要任何帮助,请告诉我。

最新更新