Android MediaPlayer 在后台播放 1 分钟后停止
Android MediaPlayer stops after playing 1 minute in background
我正在使用服务从 mediaPlayer 播放音频流,但它在后台或屏幕关闭大约一分钟后停止播放歌曲。另一方面,当应用程序保持打开状态时,它可以正常工作并完成歌曲。
public class MyService extends Service implements MediaPlayer.OnPreparedListener {
MediaPlayer mediaPlayer = null;
String audio_stream;
Context context;
public int onStartCommand(Intent intent, int flags, int startId) {
audio_stream = intent.getStringExtra("url");
mediaPlayer = new MediaPlayer();
try {
mediaPlayer.setDataSource(audio_stream);
} catch (IOException e) {
//e.printStackTrace();
}
mediaPlayer.prepareAsync();
mediaPlayer.setOnPreparedListener(this);
mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
return false;
}
});
return START_STICKY;
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onPrepared(MediaPlayer mp) {
Log.d("Channel", audio_stream+"he");
mp.start();
}
@Override
public void onDestroy() {
super.onDestroy();
if (mediaPlayer != null) {
if (mediaPlayer.isPlaying()) {
mediaPlayer.stop();
}
mediaPlayer.reset();
mediaPlayer.release();
mediaPlayer = null;
}else{
Log.d("channel", "this is the case");
}
}
@Override
public void onLowMemory() {
super.onLowMemory();
mediaPlayer.release();
}
}
在 MediaPlayer 停止之前,它在日志中给出了 4 行,它们是
V/MediaPlayer: resetDrmState: mDrmInfo=null mDrmProvisioningThread=null mPrepareDrmInProgress=false mActiveDrmScheme=false
V/MediaPlayer: cleanDrmObj: mDrmObj=null mDrmSessionId=null
V/MediaPlayer: resetDrmState: mDrmInfo=null mDrmProvisioningThread=null mPrepareDrmInProgress=false mActiveDrmScheme=false
V/MediaPlayer: cleanDrmObj: mDrmObj=null mDrmSessionId=null
我无法理解问题到底出在哪里,我该如何着手克服它。
谢谢
在 Android 8.0 及更高版本的设备上,您需要将其设置为 a foreground service,并关联一个 Notification
。否则,您的服务将在一分钟后停止。
我正在使用服务从 mediaPlayer 播放音频流,但它在后台或屏幕关闭大约一分钟后停止播放歌曲。另一方面,当应用程序保持打开状态时,它可以正常工作并完成歌曲。
public class MyService extends Service implements MediaPlayer.OnPreparedListener {
MediaPlayer mediaPlayer = null;
String audio_stream;
Context context;
public int onStartCommand(Intent intent, int flags, int startId) {
audio_stream = intent.getStringExtra("url");
mediaPlayer = new MediaPlayer();
try {
mediaPlayer.setDataSource(audio_stream);
} catch (IOException e) {
//e.printStackTrace();
}
mediaPlayer.prepareAsync();
mediaPlayer.setOnPreparedListener(this);
mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
return false;
}
});
return START_STICKY;
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onPrepared(MediaPlayer mp) {
Log.d("Channel", audio_stream+"he");
mp.start();
}
@Override
public void onDestroy() {
super.onDestroy();
if (mediaPlayer != null) {
if (mediaPlayer.isPlaying()) {
mediaPlayer.stop();
}
mediaPlayer.reset();
mediaPlayer.release();
mediaPlayer = null;
}else{
Log.d("channel", "this is the case");
}
}
@Override
public void onLowMemory() {
super.onLowMemory();
mediaPlayer.release();
}
}
在 MediaPlayer 停止之前,它在日志中给出了 4 行,它们是
V/MediaPlayer: resetDrmState: mDrmInfo=null mDrmProvisioningThread=null mPrepareDrmInProgress=false mActiveDrmScheme=false
V/MediaPlayer: cleanDrmObj: mDrmObj=null mDrmSessionId=null
V/MediaPlayer: resetDrmState: mDrmInfo=null mDrmProvisioningThread=null mPrepareDrmInProgress=false mActiveDrmScheme=false
V/MediaPlayer: cleanDrmObj: mDrmObj=null mDrmSessionId=null
我无法理解问题到底出在哪里,我该如何着手克服它。 谢谢
在 Android 8.0 及更高版本的设备上,您需要将其设置为 a foreground service,并关联一个 Notification
。否则,您的服务将在一分钟后停止。