在安卓系统中切换通知栏

6

我知道可以通过反射来扩展通知栏

    Class<?> statusbarManager = Class.forName( "android.app.StatusBarManager" );
    Method showsb;
    if (Build.VERSION.SDK_INT >= 17) {
        showsb = statusbarManager.getMethod("expandNotificationsPanel");
    }
    else {
        showsb = statusbarManager.getMethod("expand");
    }
    showsb.invoke( getSystemService( "statusbar" ) );

然而,如果它被折叠了,有没有一种方法可以将其展开,如果已经展开,则将其折叠?

在Android文档中,StatusBarManager有一个切换功能,但对我不起作用。

编辑:

我正在从绑定服务内调用此函数。


Daniel,抱歉我的(错误)答案最终得到了这里的赏金。我一直在四处寻找,但是我还没有在网上找到任何答案。不过我会继续寻找的! - Alex K
没有公共API可以做你想要的事情。即使你使用反射,它仍然受限制 - 就像你已经发现的那样。 - user4750643
2个回答

3

我认为您可能缺少所需的权限。请确保您在Manifest.xml文件中拥有EXPAND_STATUS_BAR权限:

<uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />

我找到了这段代码:

Object sbservice = getSystemService( "statusbar" );
Class<?> statusbarManager = Class.forName( "android.app.StatusBarManager" );
Method showsb = statusbarManager.getMethod( "expand" );
showsb.invoke( sbservice );

你可以尝试一下。

编辑:

如果你想要实际检测它是否已经关闭,请参考这个答案。这是它的样子:

在你的活动中,使用以下代码覆盖onWindowFocusChanged()方法:

在权限中:

<uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />

主要思想:

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

我已经拥有正确的权限,并且可以成功展开该栏。然而,我需要一种方法来判断该栏是否已经展开。 - daniely
1
谢谢Alex,实际上我是从一个绑定服务中调用这个函数的。因此,在触发此代码时,我可能正在查看任何应用程序。我已经更新了原始问题,对于缺失的细节感到抱歉。 - daniely
这仅适用于您自己的应用程序,但我们是否可以在应用程序的整个生命周期中随时检测到任何状态栏扩展?这意味着我可以在服务中实现这些功能,而且我们也可以在Android锁屏上实现这些功能。 - Sanat Pandey

0
下面的代码适用于新老版Android操作系统。 您需要在AndroidManifest.xml文件中启用EXPAND_STATUS_BAR权限。
try {
    Object sbservice = getSystemService("statusbar");
    Class<?> statusbarManager = Class.forName("android.app.StatusBarManager");
    Method expandMethod;
    expandMethod = statusbarManager.getMethod(Build.VERSION.SDK_INT >= 17 ? "expandNotificationsPanel" : "expand");
    expandMethod.invoke(sbservice);
} catch (Exception ex) {
    ex.printStackTrace();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接