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