Ada dua bagian dari solusinya
- mendeteksi tarikan panel notifikasi
- menjeda aplikasi media yang sedang diputar
Untuk mendeteksi penarikan panel notifikasi, Anda dapat menggunakan metode yang disarankan oleh Akash atau kode yang sama di sini oleh Lalith.
Di file manifes Anda
<uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />
Dalam aktivitas Anda menimpa onWindowFocusChanged () dan menulis kode di bawah ini.
@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();
}
}
}
Untuk bagian kedua, semua pemutar media yang dirancang dengan baik mengimplementasikan Pendengar Perubahan Fokus Audio. Dengan demikian untuk menjeda semua aplikasi pemutar media, Anda dapat meminta fokus audio sementara atau penuh tergantung pada apakah Anda ingin membiarkan aplikasi tersebut diputar kembali segera setelah panel notifikasi diciutkan.
Gunakan mengikuti
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);
Jangan lupa untuk mengimplementasikan 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
}
};
Apakah ada cara saya dapat memanggil fungsi onPause dari setiap aplikasi latar depan dari proses SystemUI?
Sejauh yang saya telah meneliti sistem, proses ui tidak dapat diakses. Namun, Anda dapat meluncurkan aktivitas dengan tema transparan .
Dalam manifes Anda
<activity android:name=".your.activity" android:theme="@android:style/Theme.Translucent.NoTitleBar" />
lihat ini dan saya juga telah diuji secara pribadi membuat aktivitas transparan.
Ini berarti bahwa aktivitas di atas sekarang adalah aktivitas transparan Anda dan metode onPause dari aktivitas lain secara alami akan dipanggil. Setelah panel notifikasi diciutkan, Anda dapat menghancurkan aktivitas ini. Dan untuk berada di sisi aman Anda juga dapat mengatur pendengar onTouch dengan membuat tampilan kosong yang terasa layar yang seharusnya menghancurkan aktivitas onTouch.