솔루션에는 두 부분이 있습니다
- 알림 패널 풀 감지
- 미디어 재생 앱 일시 중지
알림 패널 풀을 감지하려면 Akash에서 제안한 방법 또는 Lalith 에서 제공 하는 동일한 코드를 사용할 수 있습니다 .
매니페스트 파일에서
<uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />
활동에서 onWindowFocusChanged ()를 재정의하고 아래 코드를 작성하십시오.
@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();
}
}
}
두 번째 부분에서는 잘 디자인 된 모든 미디어 플레이어가 Audio Focus Change Listeners를 구현합니다. 따라서 모든 미디어 플레이어 앱을 일시 중지하려면 알림 패널이 축소되는 즉시 앱을 다시 재생할지 여부에 따라 임시 또는 전체 오디오 포커스를 요청할 수 있습니다.
다음을 사용하십시오
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를 구현하는 것을 잊지 마십시오
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 프로세스에서 전경 앱의 onPause 함수를 호출 할 수있는 방법이 있습니까?
내가 연구 한 한 시스템 UI 프로세스는 액세스 할 수 없습니다. 그러나 투명한 테마 로 활동을 시작할 수 있습니다 .
당신의 매니페스트에서
<activity android:name=".your.activity" android:theme="@android:style/Theme.Translucent.NoTitleBar" />
이것을 보고 나는 또한 투명한 활동을 만드는 것을 개인적으로 테스트했습니다.
즉, 지금 위에있는 활동이 투명한 활동이고 다른 활동의 onPause 메소드가 자연스럽게 호출됩니다. 알림 패널이 축소되면이 활동을 삭제할 수 있습니다. 또한 안전한면을 유지하기 위해 화면의 느낌을주는 빈보기를 만들어 onTouch의 활동을 파괴해야하는 onTouch 수신기를 설정할 수도 있습니다.