Чи можна призупинити будь-яке відео (медіаплеєр) APP в Android, коли витягніть панель сповіщень?


11

Припустимо, у мене є вихідний код AOSP. Як я можу призупинити додаток на передньому плані, коли витягувати панель сповіщень? Я переглянув Google і знайшов APP, щоб він міг прослухати подію onWindowFocusChangeта здійснити певні дії, але як я можу призупинити будь-який додаток під час витягування панелі сповіщень, не змінюючи відповідно кожного APP (що недоцільно)?

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


додав відповідь на всі ваші запитання подивитися - stackoverflow.com/a/59589825/9640177
mayank1513

Ключ - це відкриття прозорої діяльності, коли повідомлення знімається. Це зажадає методу Pauuse поточної активності. тоді як запит на фокус призведе до паузи відтворення медіа
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. призупинення будь-якої програми відтворення медіа

Для виявлення витягнення на панелі сповіщень ви можете використовувати метод, запропонований Акаш, або ж той самий код тут , 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();
        }
    }
}

У другій частині всі добре розроблені медіаплеєри реалізують слухачі змін звукової фокуси. Таким чином, щоб призупинити всі програми медіаплеєра, ви можете попросити тимчасовий або повний фокус звуку залежно від того, чи хочете ви дозволити програвачам відтворюватися знову, як тільки панель повідомлень буде розбита.

Використовуйте наступне

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?

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

У вашому маніфесті

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

бачте це, і я також особисто перевірив створення прозорої діяльності.

Це означає, що активність зверху зараз є вашою прозорою діяльністю, а метод іншої діяльності onPause, природно, буде називатися. Після того, як панель сповіщень буде згорнута, ви можете знищити цю діяльність. А щоб бути в безпеці, ви також можете встановити слухача OnTouch, створивши порожній вигляд, який відчуває екран, який повинен знищити активність onTouch.


3

Якщо припустити, що на пристрої Android використовується MediaPlayer за замовчуванням , відповідно до цієї діаграми стану , ви можете використовувати рідну pauseта stopдержавну.

Якщо ви тільки не хочете зупинити звук, можливо, ви можете змінити гучність звуку за допомогою VolumeAutomation ?

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.