IllegalStateException: finishBroadcast () вызывается вне трансляции - PullRequest
0 голосов
/ 04 июля 2018

Есть ли у кого-нибудь решение?

Fatal Exception: java.lang.IllegalStateException: finishBroadcast() called outside of a broadcast
   at android.os.RemoteCallbackList.finishBroadcast(RemoteCallbackList.java:303)
   at android.support.v4.media.session.MediaSessionCompat$MediaSessionImplApi21.setCallback(Unknown Source:28)
   at android.support.v4.media.session.MediaSessionCompat.setCallback(Unknown Source:2)
   at com.test.player.myService.onCurrentPlayerChanged(Unknown Source:196)
   at com.test.player.myService.onCurrentPlayerChanged(Unknown Source:53)
   at com.test.player.myService$$Lambda$3.accept(Unknown Source:6)
   at io.reactivex.internal.operators.observable.ObservableDoOnEach$DoOnEachObserver.onNext(Unknown Source:7)
   at io.reactivex.internal.operators.observable.ObservableDoOnEach$DoOnEachObserver.onNext(Unknown Source:12)
   at io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.onSubscribe(Unknown Source:23)
   at io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.onSubscribe(Unknown Source:6)
   at io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.onNext(Unknown Source:51)
   at io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.onSubscribe(Unknown Source:23)
   at io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.onSubscribe(Unknown Source:6)
   at io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.onNext(Unknown Source:51)
   at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.drainNormal(Unknown Source:47)
   at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.run(Unknown Source:8)
   at io.reactivex.internal.schedulers.ScheduledRunnable.run(Unknown Source:13)
   at io.reactivex.internal.schedulers.ScheduledRunnable.call(Unknown Source)
   at java.util.concurrent.FutureTask.run(FutureTask.java:266)
   at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301)
   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
   at java.lang.Thread.run(Thread.java:764)

Эта трассировка стека взята из аварии на ткани.

В onCurrentPlayerChanged() просто позвоните на услугу stopForeground.

public void onCurrentPlayerChanged(int currentPlayer) {
    if (currentPlayer != LuxePreferences.PLAYER_ONE) {
        stopForeground(true);
        NotificationManagerCompat.from(this).cancel(PLAYER_NOTIFICATION_ID);
    }
}

здесь это onCreate () и onStartCommand ()

 public void onCreate() {
    super.onCreate();

    // Create a MediaSessionCompat
    mediaSession = new MediaSessionCompat(getApplicationContext(), "RadioService",
            new ComponentName(getApplicationContext(), RadioMediaButtonReceiver.class), null);
    mediaSession.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS |
            MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS);

    stateBuilder = new PlaybackStateCompat.Builder()
            .setState(PlaybackStateCompat.STATE_STOPPED, 0, 1)
            .setActions(
                    PlaybackStateCompat.ACTION_PLAY | PlaybackStateCompat.ACTION_STOP | PlaybackStateCompat.ACTION_PAUSE);
    mediaSession.setPlaybackState(stateBuilder.build());
    mediaSession.setCallback(mediaSessionCallback);
} 

@Override
public int onStartCommand(Intent intent, int flags, int startId) {

    if (MediaButtonReceiver.handleIntent(mediaSession, intent) == null) {
        int action = intent == null ? ACTION_NONE : intent.getIntExtra(EXTRA_ACTION, ACTION_NONE);

        if (action == ACTION_NONE) {
            if (preferences.isRadioOn()) {
                startRadio();
            } else {
                boolean removeNotificationOnStop =
                        intent != null && intent.getBooleanExtra(EXTRA_REMOVE_NOTIFICATION_ON_STOP, false);
                stopRadio(removeNotificationOnStop);
            }
        } else if (action == ACTION_STOP) {            
            stopRadio(true);
            stopSelf();
        }
    }

    return Service.START_STICKY;
}

на startRadio () я также настроен mediaSession.setActive(true); на stopRadio () mediaSession.setActive(false)

установить состояние воспроизведения mediaSession следующим образом при уведомлении о настройке

if (isPlaying()) {
        mediaSession.setPlaybackState(stateBuilder
                .setState(PlaybackStateCompat.STATE_PLAYING, 0, 1).build());
        startForeground(PLAYER_NOTIFICATION_ID, notification);
    } else {
        mediaSession.setPlaybackState(stateBuilder
                .setState(PlaybackStateCompat.STATE_PAUSED, 0, 0).build());

        stopForeground(false);
    }

и onDestroy ()

@Override
public void onDestroy() {
    super.onDestroy();

    //other stuff to release resources

    if (mediaSession != null) {
        mediaSession.release();
    }
}

Есть идеи о причине этого исключения?

1 Ответ

0 голосов
/ 04 июля 2018

Вам не нужно отменить уведомление. Просто используйте: -

startForeground(NOTIFY_ID, notification.build());

Для запуска и остановки

 stopForeground(true);

Метод stopForeground(boolean removeNotification); очистит уведомление, если вы передадите true в качестве аргумента. Вы можете прочитать об этом из stopForeground .

...