0

我目前正在开发一个可以在状态栏上绘制视图的应用程序。

这是我的代码:

@Override
public void onCreate() {
    // TODO Auto-generated method stub
    super.onCreate();
    wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
    v = new StatusView(this);

    lp = new WindowManager.LayoutParams(
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.WRAP_CONTENT,
            **WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL**,
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                    | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
            PixelFormat.TRANSLUCENT);
    wm.addView(v, lp);
    Log.d(TAG, "Added view");
}

但是,我收到一个安全异常,说我无权使用此视图类型。所以我尝试添加几个权限。以下是我迄今为止尝试过的:

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.INTERNAL_SYSTEM_WINDOW"/>
<uses-permission android:name="android.permission.EXPAND_STATUS_BAR"/>
<uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>
<uses-permission android:name="android.permission.BIND_REMOTEVIEWS"/>
<uses-permission android:name="android.permission.STATUS_BAR"/>

有什么建议么?这可能是不可能的,因为状态栏不被视为窗口的一部分。

编辑:

具体错误是:

android.view.WindowManager$BadTokenException: unable to add window
android.view.ViewRoot$W@40518c50 - permission denied for this window type
4

2 回答 2

0

没关系,我解决了!问题不是 TYPE ,而是 FLAGS。

于 2012-07-13T07:45:52.593 回答
0

为了在状态栏顶部绘制视图,这是在阅读了这么多 Stackoverflow 帖子后对我有用的组合:

  1. 您需要在您的服务或活动上拥有此 LayoutParameters 的 WindowManager:

    WindowManager.LayoutParams params = new WindowManager.LayoutParams(WindowManager.LayoutParams.MATCH_PARENT,
                statusBarHeight, WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | 
                WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE | WindowManager.LayoutParams.FLAG_FULLSCREEN, 
                PixelFormat.TRANSLUCENT);
    
  2. 您只需要在您的 android 清单上获得此权限:

    uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"
    

希望有帮助。在我的情况下,我只需要用半透明的黄色或绿色为状态栏着色,以表明用户当前正在通话中。

于 2014-06-05T21:42:12.160 回答