Ci sono due parti per la soluzione
- rilevamento del pull del pannello delle notifiche
- 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.