Existem duas partes na solução
- detecção de puxar painel de notificação
- pausando qualquer aplicativo de reprodução de mídia
Para detectar o recebimento do painel de notificação, você pode empregar o método sugerido por Akash ou o mesmo código aqui por Lalith.
No seu arquivo de manifesto
<uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />
Em sua atividade, substitua onWindowFocusChanged () e escreva o código abaixo.
@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();
}
}
}
Na segunda parte, todos os reprodutores de mídia bem projetados implementam ouvintes de mudança de foco de áudio. Portanto, para pausar todos os aplicativos do media player, você pode solicitar um foco de áudio temporário ou total, dependendo se deseja permitir que os aplicativos sejam reproduzidos novamente assim que o painel de notificações for fechado.
Use as seguintes
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ão se esqueça de implementar o 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 uma maneira de chamar a função onPause de qualquer aplicativo em primeiro plano a partir do processo SystemUI?
Tanto quanto eu pesquisei sistema ui processo não está acessível. No entanto, você pode iniciar uma atividade com tema transparente .
No seu manifesto
<activity android:name=".your.activity" android:theme="@android:style/Theme.Translucent.NoTitleBar" />
veja isso e eu também testei pessoalmente criando atividades transparentes.
Isso significa que a atividade no topo agora é sua atividade transparente e o método onPause da outra atividade será chamado naturalmente. Depois que o painel de notificação estiver fechado, você poderá destruir esta atividade. E para garantir a segurança, você também pode definir o ouvinte do onTouch, criando uma exibição vazia que parece a tela que deve destruir a atividade do onTouch.