La solution comporte deux parties
- détection de la traction du panneau de notification
- suspendre toute application de lecture multimédia
Pour détecter la traction du panneau de notification, vous pouvez utiliser la méthode suggérée par Akash ou le même code ici par Lalith.
Dans votre fichier manifeste
<uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />
Dans votre activité, remplacez onWindowFocusChanged () et écrivez le code ci-dessous.
@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();
}
}
}
Pour la deuxième partie, tous les lecteurs multimédias bien conçus implémentent des écouteurs de changement de focus audio. Ainsi, pour mettre en pause toutes les applications du lecteur multimédia, vous pouvez demander un focus audio temporaire ou complet selon que vous souhaitez laisser les applications jouer à nouveau dès que le panneau de notification est réduit.
Utiliser suivant
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);
N'oubliez pas d'implémenter 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
}
};
Existe-t-il un moyen d'appeler la fonction onPause d'une application de premier plan à partir du processus SystemUI?
Pour autant que j'ai fait des recherches sur le système, le processus de l'interface utilisateur n'est pas accessible. Cependant, vous pouvez lancer une activité avec un thème transparent .
Dans votre manifeste
<activity android:name=".your.activity" android:theme="@android:style/Theme.Translucent.NoTitleBar" />
voyez cela et j'ai aussi personnellement testé la création d'une activité transparente.
Cela signifie que l'activité en haut maintenant est votre activité transparente et la méthode onPause de l'autre activité sera naturellement appelée. Une fois le panneau de notification réduit, vous pouvez détruire cette activité. Et pour être sûr, vous pouvez également définir l'écouteur onTouch en créant une vue vide qui sent l'écran qui devrait détruire l'activité onTouch.