Service.startForeground() в MediaBrowserServiceCompat

Я получаю эту ошибку, показанную в журналах сбоев Android Dashboard:

Context.startForegroundService() не вызывал Service.startForeground() (местоположение недоступно)

Я знаю об ограничениях фона, введенных в Oreo, и прочитал эту сообщение.

Тем не менее, я все еще получаю эту ошибку для небольшого процента моих пользователей, использующих Android Wear 8.0. Что сбивает с толку, так это то, что не все пользователи используют 8.0.

Согласно документации, если вы звоните Context.startForgroundService(), вы должны показать уведомление, позвонив startForeground() в службу в течение 5 секунд (я предполагаю, что MediaBrowserCompat звонит Context.startForgroundService()).

Однако я не уверен, нужно ли мне это делать, если я использую MediaBrowserServiceCompat. Я показываю уведомление переднего плана, когда пользователь нажимает кнопку воспроизведения, чтобы начать воспроизведение звука.

public class MediaActivity {

    private MediaBrowserCompat mMediaBrowserCompat;

    @Override
    public void onCreate() {
        super.onCreate(savedInstanceState);

        mMediaBrowserCompat = new MediaBrowserCompat(
                this,
                new ComponentName(this, MediaPlayerService.class),
                mMediaBrowserCompatConnectionCallback,
                getIntent().getExtras()
        );

        mMediaBrowserCompat.connect();     
    }
}

private MediaBrowserCompat.ConnectionCallback mMediaBrowserCompatConnectionCallback = new MediaBrowserCompat.ConnectionCallback() {

    @Override
    public void onConnected() {
        super.onConnected();
        final MediaControllerCompat mcc = new MediaControllerCompat(MediaActivity.this, mMediaBrowserCompat.getSessionToken());
        mcc.registerCallback(mMediaControllerCompatCallback);
        MediaControllerCompat.setMediaController(mActivity, mcc);
    }
};

public class MediaPlayerService extends MediaBrowserServiceCompat {
    @Override
    public void onCreate() {
        super.onCreate();

        //Should I add a startForeground notification here

    }
}

private MediaSessionCompat.Callback mMediaSessionCallback = new MediaSessionCompat.Callback() {
    @Override
    public void onPlay() {
        super.onPlay();

        final NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        final NotificationCompat.Builder builder = new NotificationCompat.Builder(this, channelID)

        ...
        startForeground(101, builder.build());
    }

    @Override
    public void onPause() {
        super.onPause();
    }
};

comment
У меня точно такая же проблема, о которой сообщается в панели инструментов Google. Вопреки тому, что понял @Stephen Kennedy, мы не можем вызывать startForegroundService, поскольку служба запускается и запускается MediaBrowser. На данный момент я думаю, что это ошибка Android, и мы должны с этим жить.   -  person Fabio De Lorenzo    schedule 23.01.2019
comment
Да, с тех пор я узнал, что мне не нужно вызывать Service.startForeground() в MediaService. В системе отслеживания ошибок обнаружена ошибка, связанная с этим: issuetracker.google.com/issues/76112072   -  person Kris B    schedule 25.01.2019


Ответы (1)


Вы должны использовать startForegroundService перед вызовом startforeground, чтобы прикрепить уведомление переднего плана, если вы используете службу audio mediaCompact, это не будет уничтожено системой из-за фонового ограничения.

person NitVid    schedule 08.10.2018
comment
Это объясняется на странице developer.android. com/guide/topics/media-apps/audio-app/ . Это абзац: Обратный вызов onPlay() сеанса мультимедиа должен включать код, вызывающий startService(). Это гарантирует, что служба запустится и продолжит работу, даже если все связанные с ней действия UI MediaBrowser отменяются. - person mjrduran; 21.06.2019