首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Android 懸浮窗在鎖屏界面不顯示的解決

     編輯:程式設計疑難解答

現象

使用 TYPE_PHONE 或 TYPE_TOAST 創建的懸浮窗可在普通界面顯示,但在鎖屏界面不顯示。

原因

Android 版本對鎖屏窗口類型限制不同:

  • Android 4.4~7.x:需 TYPE_SYSTEM_ALERT + SYSTEM_ALERT_WINDOW 權限。
  • Android 8.0+:引入 TYPE_APPLICATION_OVERLAY,鎖屏顯示需設置 FLAG_SHOW_WHEN_LOCKED + FLAG_TURN_SCREEN_ON + FLAG_KEEP_SCREEN_ON。
  • Android 10+:進一步限制,必須聲明 ROLE_CALL_SCREENING 或使用 KeyguardManager 請求鎖屏顯示權限。

核心代碼(Android 8.0+)

WindowManager.LayoutParams params = new WindowManager.LayoutParams(
    WindowManager.LayoutParams.WRAP_CONTENT,
    WindowManager.LayoutParams.WRAP_CONTENT,
    Build.VERSION.SDK_INT >= Build.VERSION_CODES.O ?
        WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY :
        WindowManager.LayoutParams.TYPE_PHONE,
    WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
        | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
        | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
        | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,
    PixelFormat.TRANSLUCENT
);
// 設置 gravity、x、y 等
windowManager.addView(floatView, params);

關鍵點

  1. 目標 SDK ≥ 26 必須用 TYPE_APPLICATION_OVERLAY。
  2. 必須在 Manifest 聲明 <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/> 並引導用戶授權。
  3. 鎖屏顯示需組合 FLAG_SHOW_WHEN_LOCKED 等標志位。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved