下拉通知面板时,是否可以暂停Android中的任何视频(媒体播放器)APP?


11

假设我有AOSP源代码,下拉通知面板时如何在前台暂停APP?我已经在Google上搜索,发现一个APP可以监听事件onWindowFocusChange并主动采取一些措施,但是在下拉通知面板时如何在不分别修改每个APP的情况下暂停任何 APP(这是不切实际的)?

有没有一种方法可以onPause从SystemUI进程调用任何前景应用程序的功能?


加回答你所有的问题看到这- stackoverflow.com/a/59589825/9640177
mayank1513

关键是在下拉通知时启动透明活动。这将调用当前活动的onPause方法。而请求焦点将导致媒体播放暂停
mayank1513

Answers:


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

第二部分,所有设计良好的媒体播放器都实现了“音频焦点更改监听器”。因此,要暂停所有媒体播放器应用程序,您可以请求临时或全部音频焦点,具体取决于是否要在通知面板折叠后立即让应用程序再次播放。

使用以下

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活动。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.