Android 始终在后台停止音频流
Android always stopping Audio Stream on Background
我正在开发一个广播流媒体应用程序,音频在后台运行时总是会在几分钟后停止。
清单:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
服务class:
public class StreamService extends Service implements MediaPlayer.OnPreparedListener, MediaPlayer.OnErrorListener, MediaPlayer.OnInfoListener {
private static final String STREAM_URL = "http://bbcwssc.ic.llnwd.net/stream/bbcwssc_mp1_ws-einws";
MediaPlayer mediaPlayer = null;
private WifiManager.WifiLock mWifiLock;
public int onStartCommand(Intent intent, int flags, int startId) {
mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
try {
mediaPlayer.setDataSource(STREAM_URL);
} catch (IOException e) {
e.printStackTrace();
}
mediaPlayer.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK);
mediaPlayer.setOnErrorListener(this);
mediaPlayer.setOnBufferingUpdateListener(this);
mediaPlayer.setOnInfoListener(this);
mediaPlayer.setOnPreparedListener(this);
mediaPlayer.setLooping(true);
if (mWifiLock == null) {
mWifiLock = ((WifiManager) Objects.requireNonNull(getApplicationContext().getSystemService(Context.WIFI_SERVICE)))
.createWifiLock(WifiManager.WIFI_MODE_FULL, "mediaplayerlock");
}
mediaPlayer.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK);
mediaPlayer.prepareAsync();
return START_STICKY;
}
public void onPrepared(MediaPlayer player) {
Log.e(TAG, "Service onPrepared");
mediaPlayer.start();
}
在 MainActivity 上我开始流:
Intent i = new Intent(this, StreamService.class);
i.setAction("play");
startService(i);
设备锁定几分钟后出现此错误并停止播放:
W/MediaPlayerNative: info/warning (703, 0)
W/MediaPlayerNative: info/warning (701, 0)
703 和 701 与缓冲和播放音频有关,但它每次都会永远停止一切,即使 wifi 连接良好。如果您让应用程序保持打开状态,它会一直运行,但如果您在几分钟后关闭应用程序,就会出现此错误。然后你必须重新打开应用程序,停止并重新启动流。
有关于流的警告,但代码上的所有内容似乎都是正确的:
W/MediaPlayer: Use of stream types is deprecated for operations other than volume control
W/MediaPlayer: See the documentation of setAudioStreamType() for what to use instead with android.media.AudioAttributes to qualify your playback use case
我错过了什么吗?有什么想法吗?
谢谢!
编辑:
发现当流开始时以及我收到 703 错误时会调用 onInfo:
@Override
public boolean onInfo(MediaPlayer mp, int what, int extra) {
Log.e(TAG, "Service onInfo");
return false;
}
当您的应用进入后台时,它很快就会停止。要继续播放音频,您必须以 foreground service.
的身份启动服务
清单:
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
Activity:
startForegroundService(i)
服务:
onCreate() {
super.onCreate()
startForeground(ID, createNotification())
}
我在实习测试期间创建了一个应用程序以继续播放音频或音乐,即使该应用程序已从我使用 android 后台服务
的最近历史应用程序中清除
您可以在 Github 查看代码,您可以从中了解 android
中的服务
我正在开发一个广播流媒体应用程序,音频在后台运行时总是会在几分钟后停止。
清单:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
服务class:
public class StreamService extends Service implements MediaPlayer.OnPreparedListener, MediaPlayer.OnErrorListener, MediaPlayer.OnInfoListener {
private static final String STREAM_URL = "http://bbcwssc.ic.llnwd.net/stream/bbcwssc_mp1_ws-einws";
MediaPlayer mediaPlayer = null;
private WifiManager.WifiLock mWifiLock;
public int onStartCommand(Intent intent, int flags, int startId) {
mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
try {
mediaPlayer.setDataSource(STREAM_URL);
} catch (IOException e) {
e.printStackTrace();
}
mediaPlayer.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK);
mediaPlayer.setOnErrorListener(this);
mediaPlayer.setOnBufferingUpdateListener(this);
mediaPlayer.setOnInfoListener(this);
mediaPlayer.setOnPreparedListener(this);
mediaPlayer.setLooping(true);
if (mWifiLock == null) {
mWifiLock = ((WifiManager) Objects.requireNonNull(getApplicationContext().getSystemService(Context.WIFI_SERVICE)))
.createWifiLock(WifiManager.WIFI_MODE_FULL, "mediaplayerlock");
}
mediaPlayer.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK);
mediaPlayer.prepareAsync();
return START_STICKY;
}
public void onPrepared(MediaPlayer player) {
Log.e(TAG, "Service onPrepared");
mediaPlayer.start();
}
在 MainActivity 上我开始流:
Intent i = new Intent(this, StreamService.class);
i.setAction("play");
startService(i);
设备锁定几分钟后出现此错误并停止播放:
W/MediaPlayerNative: info/warning (703, 0)
W/MediaPlayerNative: info/warning (701, 0)
703 和 701 与缓冲和播放音频有关,但它每次都会永远停止一切,即使 wifi 连接良好。如果您让应用程序保持打开状态,它会一直运行,但如果您在几分钟后关闭应用程序,就会出现此错误。然后你必须重新打开应用程序,停止并重新启动流。
有关于流的警告,但代码上的所有内容似乎都是正确的:
W/MediaPlayer: Use of stream types is deprecated for operations other than volume control
W/MediaPlayer: See the documentation of setAudioStreamType() for what to use instead with android.media.AudioAttributes to qualify your playback use case
我错过了什么吗?有什么想法吗?
谢谢!
编辑:
发现当流开始时以及我收到 703 错误时会调用 onInfo:
@Override
public boolean onInfo(MediaPlayer mp, int what, int extra) {
Log.e(TAG, "Service onInfo");
return false;
}
当您的应用进入后台时,它很快就会停止。要继续播放音频,您必须以 foreground service.
的身份启动服务清单:
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
Activity:
startForegroundService(i)
服务:
onCreate() {
super.onCreate()
startForeground(ID, createNotification())
}
我在实习测试期间创建了一个应用程序以继续播放音频或音乐,即使该应用程序已从我使用 android 后台服务
的最近历史应用程序中清除您可以在 Github 查看代码,您可以从中了解 android
中的服务