Можно ли приостановить любое видео (медиаплеер) приложение в Android, когда вы опустите панель уведомлений?

11

Предположим, у меня есть исходный код AOSP. Как я могу приостановить приложение на переднем плане при опускании панели уведомлений? Я гуглил и обнаружил, что приложение может прослушать событие onWindowFocusChangeи предпринять какие-то действия с упреждением, но как я могу приостановить ЛЮБОЕ приложение, когда опускаю панель уведомлений, не изменяя соответственно каждое приложение (что нецелесообразно)?

Есть ли способ, которым я могу вызвать onPauseфункцию любого приложения переднего плана из процесса SystemUI?

zhangxaochen
источник
добавленный ответ на все ваши вопросы смотрите здесь - stackoverflow.com/a/59589825/9640177
mayank1513
Ключ запускает прозрачную активность при извлечении уведомления. Это вызовет метод текущей активности onPause. в то время как запрос фокуса приведет к приостановке воспроизведения медиа
mayank1513

Ответы:

10

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

В вашем файле манифеста

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

В своей деятельности переопределите onWindowFocusChanged()и напишите следующий код.

Это использует разрешение

@Override
public void onWindowFocusChanged(boolean hasFocus)
{
    try
    {
        if(!hasFocus)
        {
            Object service  = getSystemService("statusbar");
            Class<?> statusbarManager = Class.forName("android.app.StatusBarManager");
            Method collapse = statusbarManager.getMethod("collapse");
            collapse .setAccessible(true);
            collapse .invoke(service);
        }
    }
    catch(Exception ex)
    {
        if(!hasFocus)
        {
            try {
                Object service  = getSystemService("statusbar");
                Class<?> statusbarManager = Class.forName("android.app.StatusBarManager");
                Method collapse = statusbarManager.getMethod("collapse");
                collapse .setAccessible(true);
                collapse .invoke(service);

            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();                
            }
            ex.printStackTrace();
        }
    }
}

Затем в вашем приложении запрос на аудио-фокус, смотрите ссылку ниже

https://developer.android.com/guide/topics/media-apps/audio-focus#java

Это приостановит доступ к аудио для всех других приложений.

Акаш Дубей
источник
1
@zhangxaochen щедрость истекает через 5 часов, вы уже потеряли ее, и, если срок ее истек, он был потрачен впустую!
Акаш Дубей
3

Решение состоит из двух частей

  1. обнаружение извлечения панели уведомлений
  2. приостановка воспроизведения любого мультимедийного приложения

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

В вашем файле манифеста

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

В своей деятельности переопределите onWindowFocusChanged () и напишите приведенный ниже код.

@Override
public void onWindowFocusChanged(boolean hasFocus)
{
    try
    {
        if(!hasFocus)
        {
            Object service  = getSystemService("statusbar");
            Class<?> statusbarManager = Class.forName("android.app.StatusBarManager");
            Method collapse = statusbarManager.getMethod("collapse");
            collapse .setAccessible(true);
            collapse .invoke(service);
        }
    }
    catch(Exception ex)
    {
        if(!hasFocus)
        {
            try {
                Object service  = getSystemService("statusbar");
                Class<?> statusbarManager = Class.forName("android.app.StatusBarManager");
                Method collapse = statusbarManager.getMethod("collapse");
                collapse .setAccessible(true);
                collapse .invoke(service);

            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();                
            }
            ex.printStackTrace();
        }
    }
}

Для второй части все хорошо разработанные медиаплееры реализуют Audio Focus Change Listeners. Таким образом, чтобы приостановить все приложения медиапроигрывателя, вы можете запросить временную или полную фокусировку звука в зависимости от того, хотите ли вы снова воспроизвести приложения, как только панель уведомлений будет свернута.

Используйте следующие

AudioManager audioManager = (AudioManager) Context.getSystemService(Context.AUDIO_SERVICE);
playbackAttributes = new AudioAttributes.Builder()
    .setUsage(AudioAttributes.USAGE_GAME)
    .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
    .build();
focusRequest = new AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN)
    // replace AUDIOFOCUS_GAIN with AUDIOFOCUS_GAIN_TRANSIENT if you want to pause and again resume when notification panel collapsed
    .setAudioAttributes(playbackAttributes)
    .setAcceptsDelayedFocusGain(true)
    .setOnAudioFocusChangeListener(afChangeListener, handler)
    .build();
// to requestAudioFocus and pause other media apps
audioManager.requestAudioFocus(focusRequest);

// to resume again in case you requested AUDIOFOCUS_GAIN_TRANSIENT
audioManager.abandonAudioFocus(afChangeListener);

Не забудьте реализовать AudioFocusChangeListener

AudioManager.OnAudioFocusChangeListener afChangeListener = new AudioManager.OnAudioFocusChangeListener() {
    @Override
    public void onAudioFocusChange(int focusChange) {
        // leave this empty if you don't need to handle audio focus for your app
    }
};

Есть ли способ, которым я могу вызвать функцию onPause любого приложения переднего плана из процесса SystemUI?

Насколько я исследовал, системный интерфейс не доступен. Однако вы можете запустить занятие с прозрачной темой .

В вашем манифесте

<activity android:name=".your.activity" android:theme="@android:style/Theme.Translucent.NoTitleBar" />

увидеть это, и я также лично проверил создание прозрачной деятельности.

Это означает, что активность сверху теперь является вашей прозрачной активностью, и естественно вызывается метод onPause другого действия. После того, как панель уведомлений свернута, вы можете уничтожить это действие. И чтобы быть в безопасности, вы также можете настроить прослушиватель onTouch, создав пустое представление, которое воспринимает экран, который должен уничтожить активность на Touch.

mayank1513
источник
3

Предполагая, что устройство Android использует MediaPlayer по умолчанию , в соответствии с этой диаграммой состояний вы можете использовать native pauseи stopstate.

Если вы не хотите останавливать звук, вы можете изменить громкость звука, используя VolumeAutomation ?

СТЕФАНИ
источник