Rozwiązanie składa się z dwóch części
- wykrywanie ściągnięcia panelu powiadomień
- wstrzymywanie dowolnej aplikacji do odtwarzania multimediów
Aby wykryć ściąganie panelu powiadomień, możesz zastosować metodę sugerowaną przez Akash lub ten sam kod tutaj przez Lalith.
W twoim pliku manifestu
<uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />
W swojej działalności zastąp metodę onWindowFocusChanged () i napisz poniższy kod.
@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();
}
}
}
W drugiej części wszystkie dobrze zaprojektowane odtwarzacze multimedialne wykorzystują Audio Focus Change Listeners. Dlatego, aby wstrzymać wszystkie aplikacje odtwarzacza multimediów, możesz poprosić o tymczasowe lub pełne skupienie dźwięku w zależności od tego, czy chcesz zezwolić aplikacjom na odtwarzanie, gdy tylko panel powiadomień zostanie zwinięty.
Użyj następujących
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);
Nie zapomnij wdrożyć 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
}
};
Czy istnieje sposób, aby wywołać funkcję onPause dowolnej aplikacji na pierwszym planie z procesu SystemUI?
O ile badałem proces interfejsu użytkownika systemu nie jest dostępny. Możesz jednak uruchomić działanie z przezroczystym motywem .
W twoim manifeście
<activity android:name=".your.activity" android:theme="@android:style/Theme.Translucent.NoTitleBar" />
zobacz to i osobiście przetestowałem, tworząc przejrzystą aktywność.
Oznacza to, że aktywność na górze jest teraz twoją przezroczystą aktywnością, a metoda onPause innej aktywności zostanie naturalnie wywołana. Po zwinięciu panelu powiadomień możesz zniszczyć tę aktywność. Aby być bezpiecznym, możesz również ustawić odbiornik onTouch, tworząc pusty widok, który odczuwa ekran, który powinien zniszczyć aktywność onTouch.