Die Lösung besteht aus zwei Teilen
- Benachrichtigungsfeld ziehen erkennen
- Anhalten einer App zur Medienwiedergabe
Zur Erfassung Benachrichtigungsfenster ziehen Sie die Methode vorgeschlagen einsetzen kann durch Akash oder denselben Code hier von Lalith.
In Ihrer Manifestdatei
<uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />
Überschreiben Sie in Ihrer Aktivität onWindowFocusChanged () und schreiben Sie den folgenden Code.
@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();
}
}
}
Für den zweiten Teil implementieren alle gut gestalteten Mediaplayer Audio Focus Change Listener. Um alle Media Player-Apps anzuhalten, können Sie einen temporären oder vollständigen Audiofokus anfordern, je nachdem, ob Sie die Apps wieder abspielen lassen möchten, sobald das Benachrichtigungsfeld ausgeblendet ist.
Verwenden Sie Folgendes
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);
Vergessen Sie nicht, AudioFocusChangeListener zu implementieren
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
}
};
Gibt es eine Möglichkeit, die onPause-Funktion einer Vordergrund-App über den SystemUI-Prozess aufzurufen?
Soweit ich das System untersucht habe, ist der Prozess nicht zugänglich. Sie können jedoch eine Aktivität mit transparentem Thema starten .
In deinem Manifest
<activity android:name=".your.activity" android:theme="@android:style/Theme.Translucent.NoTitleBar" />
siehe dies und ich habe auch persönlich getestet, transparente Aktivitäten zu erstellen.
Dies bedeutet, dass die Aktivität oben Ihre transparente Aktivität ist und die onPause-Methode der anderen Aktivität natürlich aufgerufen wird. Sobald das Benachrichtigungsfeld ausgeblendet ist, können Sie diese Aktivität zerstören. Und um auf der sicheren Seite zu sein, können Sie auch den onTouch-Listener einstellen, indem Sie eine leere Ansicht erstellen, die den Bildschirm fühlt, der die Aktivität aufTouch zerstören sollte.