Çözümün iki parçası var
- bildirim paneli çekmesini algılama
- herhangi bir medya yürütme uygulamasını duraklatma
Bildirim panelinin çekildiğini tespit etmek için Akash tarafından önerilen yöntemi veya burada Lalith tarafından aynı kodu kullanabilirsiniz .
Manifest dosyanızda
<uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />
Etkinliğinizde onWindowFocusChanged () öğesini geçersiz kılın ve aşağıdaki kodu yazın.
@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();
}
}
}
İkinci bölüm için tüm iyi tasarlanmış medya oynatıcılar Ses Odak Değişimi Dinleyicileri uygular. Bu nedenle, tüm medya oynatıcı uygulamalarını duraklatmak için, bildirim paneli çöktüğünde uygulamaların tekrar oynatılmasına izin vermek isteyip istemediğinize bağlı olarak geçici veya tam ses odaklaması isteyebilirsiniz.
Aşağıdakileri kullan
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);
AudioFocusChangeListener'ı uygulamayı unutmayın
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
}
};
SystemUI işleminden herhangi bir ön plan App onPause işlevini çağırabilirsiniz bir yolu var mı?
Bildiğim kadarıyla sistem ui sürecine erişilemiyor. Ancak, şeffaf temalı bir etkinlik başlatabilirsiniz .
Manifestinizde
<activity android:name=".your.activity" android:theme="@android:style/Theme.Translucent.NoTitleBar" />
Bunu görüyorum ve ayrıca şeffaf etkinlik oluşturmayı şahsen test ettim.
Bu, üstteki etkinliğin şeffaf etkinliğiniz olduğu ve diğer etkinliğin onPause yönteminin doğal olarak çağrılacağı anlamına gelir. Bildirim paneli daraltıldıktan sonra bu etkinliği yok edebilirsiniz. Ve güvenli tarafta olmak için, ekranı TouchTo etkinliğini yok etmesi gereken boş bir görünüm oluşturarak onTouch dinleyicisini de ayarlayabilirsiniz.