2017-02-21 147 views
2

我看過:WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY總是與<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />組合AndroidManifest.xml。例如here對於WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,我需要android.permission.SYSTEM_ALERT_WINDOW嗎?

考慮以下代碼:

windowManager = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE); 
    surfaceView = new SurfaceView(this); 
    WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams(
      100, 100, 
      WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY, 
      WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, 
      PixelFormat.TRANSLUCENT 
    ); 
    layoutParams.gravity = Gravity.START | Gravity.TOP; 
    windowManager.addView(surfaceView, layoutParams); 

我需要爲這個代碼SYSTEM_ALERT_WINDOW權限?

docSYSTEM_ALERT_WINDOW

允許應用來創建使用TYPE_SYSTEM_ALERT,在所有其他應用的頂部示出的窗戶。很少有應用程序應該使用此權限;這些窗口用於與用戶進行系統級交互。

這是關於TYPE_SYSTEM_ALERT而不是約TYPE_SYSTEM_OVERLAY。嗯?

UPDATE:
行:windowManager.addView(surfaceView, layoutParams);

java.lang.RuntimeException: Unable to create service: android.view.WindowManager$BadTokenException: Unable to add window [email protected] -- permission denied for this window type 

所以大概<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />是必要的。

+0

我推薦你發帖y我們的解決方案作爲答案,並接受它,當我看到您的問題時,我的第一印象是尚未得到答覆,但您的第二個更新對我有很大幫助。 –

回答

2

變化
WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY變爲WindowManager.LayoutParams.TYPE_TOAST
android.permission.SYSTEM_ALERT_WINDOW從應用程序設置中刪除,它的工作原理。

啓發:here

WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams(
      100, 100, 
      WindowManager.LayoutParams.TYPE_TOAST, 
      WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, 
      PixelFormat.TRANSLUCENT 
); 

看來,這種解決方案並不需要android:name="android.permission.SYSTEM_ALERT_WINDOW"

UPDATE
LayoutParams.TYPE_TOAST從API 26. LayoutParams.TYPE_APPLICATION_OVERLAY代替過時,它是需要android.Manifest.permission#SYSTEM_ALERT_WINDOW權限=>See more

+0

:D無論如何你必須要求許可 – atasoyh