Как запретить уведомления при воспроизведении музыки в фоновом режиме, как в Spotify и Google Music - PullRequest
0 голосов
/ 27 ноября 2018

Spotify и Google Music позволяют пользователю воспроизводить музыку в фоновом режиме, что также позволяет запретить уведомление мультимедиа.Когда вы перемещаете одно из этих приложений в фоновый режим, а затем приостанавливаете воспроизведение, вы можете отклонить медиа-уведомление.Однако, если вы не отклоните уведомление, и оно останется в состоянии паузы на длительное время, Система не прекратит работу «аудио-службы», поскольку уведомление всегда отображается и немедленно реагирует на воспроизведение / паузу.

Насколько я знаю, невозможно использовать службы переднего плана, так как для того, чтобы отклонить уведомление, нам нужно вызвать stopForeground (false), что позволило бы системе убить службу.

Здеськак мы это делаем прямо сейчас, в нашем приложении:

Когда начинается воспроизведение, мы запускаем MusicService в качестве службы переднего плана со следующим кодом:

startForeground(mediaNotification)

Затем,Когда пользователь покидает приложение, он может управлять воспроизведением через медиа-уведомления.Поскольку уведомление тесно связано с MusicService, пользователь не сможет отклонить его, пока мы не вызовем:

stopForeground(false)

Вот почему мы вызываем этот метод, когда пользователь нажимает кнопку паузы.Однако это создает фон Сервиса, поэтому система убьет его за короткий промежуток времени.

Как Spotify и Google Music могли бы обойти это?Как это сделать?

Ответы [ 4 ]

0 голосов
/ 21 августа 2019

Вы пытались использовать

NotificationCompat.Builder()
...
.setOngoing(true)
...
.build()

?

Нужно сделать свое дело.

На самом деле вам не нужно останавливаться на переднем плане.Просто используйте эту настройку.Если вы хотите изменить это - просто создайте новое Уведомление с постоянным == ложным, а затем назовите его следующим образом:

notificationManager.notify( id, yourNotification )
0 голосов
/ 13 апреля 2019

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

0 голосов
/ 15 апреля 2019

Используя комбинацию ответа Пуйи и некоторых независимых исследований, у меня есть фрагмент кода, который ведет себя довольно близко к приложениям, таким как Spotify, с использованием OOTB MediaPlayer.Возможно, есть более элегантное решение, но это быстрая и грязная версия - у меня слишком много разбросанного кода для публикации, поэтому вместо этого есть обзор:

Когда медиаплеер приостановлен, я запускаю две частикод.Сначала, после обновления панели уведомлений, я превращаю ее из службы переднего плана в фоновую с помощью:

public void demoteNotifyBar() {
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
            stopForeground(STOP_FOREGROUND_DETACH);
        else
            stopForeground(false);
    }

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

// Put this in the onCreate method
pauseRefresh = new Runnable() {
            @Override
            public void run() {
                // Check if media is playing to prevent race conditions
                if (!isPlaying()) {
                    startForeground(FOREGROUND_SERVICE, notification);
                    demoteNotifyBar();
                    handler.postDelayed(pauseRefresh, 1000);
                }
            }
        };

// Call this wherever you're handling the pause button
pauseRefresh.run();

Чтобы отменить автообновление, вам нужно вызвать этот бит кода перед тем, как переделать панель уведомлений и переключить медиа с паузы на воспроизведение (да, вы можете проигнорировать это для переключения аудио, но читайте нижепочему это необходимо):

handler.removeCallbacks(pauseRefresh);

Вам также нужно будет прослушивать отклонение свайпа с намерением удаления, чтобы предотвратить повторное извещение уведомления, когда пользователь отклоняет его;просто используйте тот же код, чтобы отменить таймер, который используется, когда пользователь нажимает кнопку воспроизведения.

0 голосов
/ 11 апреля 2019

так что вы хотите, когда другое приложение воспроизводит свою музыку, вы хотите, чтобы ваше уведомление было отклонено.вам нужно это сделать, когда вы создаете уведомление (я полагаю, в Mediaprepare () или щелкните или что-то еще), когда вы создаете уведомление, которое вы устанавливаете builder.setOngoing (true), и когда ваш пользователь приостанавливает музыку или другое приложение использует медиа сервис, выустановите builder.setOngoing (false), чтобы пользователь мог легко отклонить ваше уведомление.

Happy Coding

...