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
播放一段时间后最大化应用时。在这种情况下,您需要一个持久性机制来跟踪。喜欢SharedPreferences
或SQLite
.
文档: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 组件都可以与你将实现的服务进行通信。
关于开始和停止流式传输,这将取决于您的应用程序设计。我认为这种方法将对所有预期的应用程序设计开放。
如果您需要任何帮助,请告诉我。