【问题标题】:Android always stopping Audio Stream on BackgroundAndroid总是在后台停止音频流
【发布时间】:2020-05-19 20:54:27
【问题描述】:

我正在开发一个广播流媒体应用程序,几分钟后音频总是在后台停止。

清单:

<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;
}

【问题讨论】:

    标签: android android-studio android-mediaplayer audio-streaming


    【解决方案1】:

    当您的应用程序进入后台时,它会在不久之后停止。要继续播放音频,您必须以 foreground service 身份启动服务。

    清单:

    <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
    

    活动:

    startForegroundService(i)
    

    服务:

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

    【讨论】:

    • 你自己测试过吗?我认为这不太正确,因为 MediaPlayer 也不会在前台服务中运行,这与不同的线程有关。
    • @francogrex 线程与前台服务完全无关。前台服务只确保在播放音乐时进程不会被杀死。
    • Tynn,很好,但是即使在前台服务中,媒体播放器也会被杀死(或者甚至不会在服务中启动),因此我的问题是,你自己尝试过吗,或者是它基于你的理论知识?
    【解决方案2】:

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

    你可以在 Github 上查看代码,在那里你可以对 Android 中的服务有所了解

    https://github.com/pratikKataria/InternshipTest

    【讨论】:

    • 后台服务最多持续 30 分钟。 @tynn 是正确的。他需要前台服务。
    猜你喜欢
    • 1970-01-01
    • 2014-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-22
    • 2013-09-19
    • 2019-03-25
    相关资源
    最近更新 更多