web-dev-qa-db-ja.com

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

サービスクラス:

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は、オーディオのバッファリングと再生に関連していますが、Wi-Fi接続が良好であっても、毎回すべてを永久に停止します。アプリを開いたままにしておくと永久に機能しますが、数分でアプリを閉じると、このエラーが表示されます。次に、アプリを再度開き、ストリームを停止して再起動する必要があります。

ストリームに関する警告がありますが、コードのすべてが正しいようです:

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

私が使用した最近の履歴アプリからアプリがクリアされても、オーディオまたは音楽の再生を継続するために、インターンシップテスト中にアプリを作成しましたAndroidバックグラウンドサービス

あなたはGithubでコードをチェックして、Androidのサービスについていくつかのアイデアを得ることができます

https://github.com/pratikKataria/InternshipTest

0
brew