È possibile mettere in pausa qualsiasi APP video (mediaplayer) in Android quando si apre il pannello delle notifiche?


11

Supponiamo di avere il codice sorgente AOSP, come posso mettere in pausa l'APP in primo piano quando si apre il pannello delle notifiche? Ho cercato su Google e trovo un'APP in grado di ascoltare l'evento onWindowFocusChangee intraprendere alcune azioni in modo proattivo, ma come posso mettere in pausa QUALSIASI APP quando si abbassa il pannello di notifica, senza modificare ogni APP rispettivamente (che non è pratico)?

Esiste un modo in cui posso chiamare la onPausefunzione di qualsiasi App in primo piano dal processo SystemUI?


risposta aggiunto a tutte le vostre domande a vedere questo - stackoverflow.com/a/59589825/9640177
mayank1513

La chiave avvia un'attività trasparente quando la notifica viene abbassata. Questo chiamerà il metodo onPause dell'attività corrente. mentre richiedere lo stato
attivo metterà

Risposte:


10

Puoi utilizzare il metodo seguente per rilevare l'attrazione del pannello delle notifiche,

Nel tuo file manifest

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

Nella tua attività sovrascrivi il onWindowFocusChanged()e scrivi il codice qui sotto.

Questo utilizza l'autorizzazione

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

Quindi nella richiesta dell'app per il focus audio, fai riferimento al link di seguito

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

Ciò interromperà l'accesso audio per tutte le altre app.


1
La generosità di @zhangxaochen scade tra 5 ore, l'hai già persa e, se viene scaduta, viene sprecata !!
Akash Dubey,

3

Ci sono due parti per la soluzione

  1. rilevamento del pull del pannello delle notifiche
  2. mettere in pausa qualsiasi app di riproduzione multimediale

Per rilevare il pull del pannello delle notifiche puoi utilizzare il metodo suggerito da Akash o lo stesso codice qui da Lalith.

Nel tuo file manifest

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

Nella tua attività sovrascrivi onWindowFocusChanged () e scrivi il codice seguente.

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

Per la seconda parte, tutti i lettori multimediali ben progettati implementano gli ascoltatori di Focus Focus Change. Pertanto, per mettere in pausa tutte le app del lettore multimediale è possibile richiedere la messa a fuoco audio temporanea o completa a seconda che si desideri consentire la riproduzione delle app non appena il pannello di notifica viene chiuso.

Usa il seguente

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);

Non dimenticare di implementare 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
    }
};

Esiste un modo per poter chiamare la funzione onPause di qualsiasi app in primo piano dal processo SystemUI?

Per quanto ho studiato il sistema il processo non è accessibile. Tuttavia, è possibile avviare un'attività con tema trasparente .

Nel tuo manifest

<activity android:name=".your.activity" android:theme="@android:style/Theme.Translucent.NoTitleBar" />

guarda questo e ho anche testato personalmente la creazione di attività trasparenti.

Ciò significa che l'attività in cima ora è la tua attività trasparente e il metodo onPause dell'altra attività verrà naturalmente chiamato. Una volta chiuso il pannello delle notifiche, puoi distruggere questa attività. E per essere al sicuro puoi anche impostare l'ascoltatore di Touch creando una vista vuota che percepisca lo schermo che dovrebbe distruggere l'attività su Touch.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.