2014-10-28 84 views
4

通知栏我知道我可以通过反射切换android系统

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的切换功能,但它不适用于我。

EDITED

我从绑定服务中调用这个函数。

+0

丹尼尔,对不起,我的(错误)答案最终在这里获得了赏金。我一直在环顾四周,我一直无法在网上找到答案。我会继续寻找! – 2014-11-30 03:55:22

+0

有没有公共的API来做你想做的。即使你使用反射,它仍然是受限制的 - 正如你发现的那样。 – 2015-07-09 16:18:44

回答

2

我认为你可能会缺少所需的权限。请确保您有EXPAND_STATUS_BAR许可,您的Manifest.xml:

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

你可能想尝试一下。

编辑:

对于实际检测,如果它是关闭或没有,见this answer。这里是什么样子:

覆盖的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(); 
     } 
    } 
} 
+0

我已经拥有了正确的权限,并且可以成功扩展栏。但是,我需要一种方法来了解该栏是否已经展开。 – daniely 2014-11-21 02:31:15

+1

感谢亚历克斯,我实际上是从绑定服务调用此函数。所以我可以在触发代码的同时查看任何应用程序。我已更新原始问题,对遗漏的详细信息感到抱歉。 – daniely 2014-11-21 03:01:08

+0

这仅适用于您自己的应用程序,但有可能我们可以在应用程序的生命周期中随时检测任何状态栏扩展?意味着我可以在服务类的东西中实现这些,我们也可以在Android锁屏上实现这些。 – 2016-09-05 05:42:37