Ist es möglich, eine Video-App (Mediaplayer) in Android anzuhalten, wenn das Benachrichtigungsfeld geöffnet wird?

11

Angenommen, ich habe den AOSP-Quellcode. Wie kann ich die APP im Vordergrund anhalten, wenn ich das Benachrichtigungsfeld herunterziehe? Ich habe eine APP gegoogelt und finden Sie können das Ereignis hören onWindowFocusChangeund einige Maßnahmen proaktiv nehmen, aber wie kann ich Pause JEDE APP , wenn das Benachrichtigungsfeld nach unten ziehen, ohne jede APP ändern bzw. (was unpraktisch ist)?

Gibt es eine Möglichkeit, die onPauseFunktion einer Vordergrund-App über den SystemUI-Prozess aufzurufen?

zhangxaochen
quelle
Antwort auf alle Ihre Fragen hinzugefügt siehe - stackoverflow.com/a/59589825/9640177
mayank1513
Der Schlüssel startet eine transparente Aktivität, wenn die Benachrichtigung heruntergezogen wird. Dadurch wird die onPause-Methode der aktuellen Aktivität aufgerufen.
Wenn Sie den

Antworten:

10

Sie können die folgende Methode verwenden, um das Ziehen des Benachrichtigungsfelds zu erkennen:

In Ihrer Manifestdatei

 <uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />

Überschreiben Sie in Ihrer Aktivität onWindowFocusChanged()den folgenden Code und schreiben Sie ihn.

Dies verwendet die Berechtigung

@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();
        }
    }
}

Klicken Sie dann in Ihrer App-Anfrage für den Audiofokus auf den folgenden Link

https://developer.android.com/guide/topics/media-apps/audio-focus#java

Dadurch wird der Audiozugriff für alle anderen Apps angehalten.

Akash Dubey
quelle
1
@zhangxaochen Kopfgeld läuft in 5 Stunden ab, du hast es bereits verloren und wenn es abgelaufen ist, wurde es verschwendet !!
Akash Dubey
3

Die Lösung besteht aus zwei Teilen

  1. Benachrichtigungsfeld ziehen erkennen
  2. 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.

mayank1513
quelle
3

Angenommen , das Android- Gerät verwendet den Standard- MediaPlayer gemäß diesem Statusdiagramm , können Sie den nativen verwendenpause und den stopStatus verwenden.

Wenn Sie den Ton nur nicht stoppen möchten, können Sie wahrscheinlich die Lautstärke mithilfe einer VolumeAutomation ändern .

Ein STEFANI
quelle