Android总是在后台停止音频流

3

我正在开发一款无线电流应用程序,但是当应用程序在后台运行时,音频总是在几分钟后停止播放。

清单:

<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"/>

服务类:

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

我有所遗漏吗?有什么想法吗?

谢谢!

编辑:

发现 onInfo 在流开始时调用,以及当我收到 703 错误时调用:

@Override
public boolean onInfo(MediaPlayer mp, int what, int extra) {
    Log.e(TAG, "Service onInfo");
    return false;
}
2个回答

5
当您的应用程序进入后台后,它会很快停止。为了继续播放音频,您需要将服务作为前台服务启动。
清单文件:
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>

活动:

startForegroundService(i)

服务:

onCreate() {
    super.onCreate()
    startForeground(ID, createNotification())
}

你自己测试过吗?我认为这并不完全正确,因为MediaPlayer也无法在前台服务中运行,可能与不同的线程有关。 - user2587965
@francogrex 线程与前台服务完全无关。前台服务只是确保在音乐播放时进程不被终止。 - tynn
Tynn,细节看似不错,但即使在前台服务中,媒体播放器仍然会被杀掉(或者干脆不会启动),因此我问你,你自己试过吗?还是只基于理论知识? - user2587965

0

我在实习测试期间创建了一个应用程序,即使该应用程序从最近的历史应用程序中被清除,也能继续播放音频或音乐。我使用了Android后台服务。

你可以在Github上查看代码,从中了解一些关于Android中的服务的想法。

https://github.com/pratikKataria/InternshipTest


后台服务最多持续30分钟。@tynn是正确的。他需要一个前台服务。 - Robin Davies

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接