Решение состоит из двух частей
- обнаружение извлечения панели уведомлений
- приостановка воспроизведения любого мультимедийного приложения
Для обнаружения извлечения панели уведомлений вы можете использовать метод, предложенный 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.