알림 패널을 풀 때 Android에서 비디오 (미디어 플레이어) APP를 일시 중지 할 수 있습니까?


11

AOSP 소스 코드가 있다고 가정합니다. 알림 패널을 내릴 때 APP를 포 그라운드에서 일시 중지하려면 어떻게해야합니까? 검색 좀하고 APP 이벤트를들을 수 있습니다 발견했습니다 onWindowFocusChange과 사전에 몇 가지 조치를 취할 수 있지만, 어떻게 일시 정지 할 수 있습니다 ANY (비실용적 인) 각각 모든 응용 프로그램을 수정하지 않고, 알림 패널을 아래로 당기는 때 APP를?

onPauseSystemUI 프로세스에서 전경 앱 의 함수를 호출 할 수있는 방법이 있습니까?


- 모든 질문에 대한 추가 대답이 참조 stackoverflow.com/a/59589825/9640177
mayank1513을

알림이 풀리면 키가 투명한 활동을 시작합니다. 현재 활동의 onPause 메소드를 호출합니다. 포커스를 요청하면 미디어 재생이 일시 중지됩니다.
mayank1513

답변:


10

알림 패널 풀을 감지하기 위해 아래 방법을 사용할 수 있습니다.

매니페스트 파일에서

 <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();
        }
    }
}

그런 다음 앱의 오디오 포커스 요청에서 아래 링크를 참조하십시오.

https://developer.android.com/guide/topics/media-apps/audio-focus#java

다른 모든 앱의 오디오 액세스가 일시 중지됩니다.


1
@zhangxaochen 현상금은 5 시간 안에 만료되며 이미 잃어 버렸고 만료되면 낭비되었습니다!
Akash Dubey

3

솔루션에는 두 부분이 있습니다

  1. 알림 패널 풀 감지
  2. 미디어 재생 앱 일시 중지

알림 패널 풀을 감지하려면 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 수신기를 설정할 수도 있습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.