태그 보관물: android-developer-api

android-developer-api

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

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

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



답변

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

매니페스트 파일에서

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


답변

상태 다이어그램 에 따라 Android 디바이스가 기본 MediaPlayer를 사용 한다고 가정하면 기본 및 상태를 사용할 수 있습니다 .pausestop

소리를 멈추고 싶지 않다면 VolumeAutomation ?


답변