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 に答える