適配懸浮窗許可權與系統設定修改許可權

ezy發表於2017-04-01

Github: github.com/czy1121/set…
Blog: reezy.me/2016-12-25/…

Android 6.0的特殊許可權(Special Permissions)包括

  • 懸浮窗許可權(SYSTEM_ALERT_WINDOW)
  • 系統設定修改許可權(WRITE_SETTINGS)

Android 6.0以前只要在manifest中申請了許可權就是預設開啟的
Android 6.0+需要在manifest中申請並且通過傳送Intent讓使用者在設定介面進行勾選

適配

檢測

  • API 23+(Android 6.0+/M) 使用 Settings.canDrawOverlays, Settings.System.canWrite
  • API 18+(Android 4.3+/JellyBean MR2) 通過反射使用 AppOpsManager.checkOp
  • API < 18 預設許可權開啟,時始終返回 true

授權

  • API 23+(Android 6.0+/M) 去系統設定皮膚就好
    new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
    new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS);複製程式碼
  • API 18+(Android 4.3+/JellyBean MR2) 預設許可權開啟
  • API < 18 預設許可權開啟,不做任何處理

切換授權狀態

AppOpsManager.setMode 可用於Android 4.3/4.4修改授權狀態

API 18 新增AppOpsManager(被隱藏,在Android 4.4公開)
API 21 後需要簽名驗證的許可權android.Manifest.permission.UPDATE_APP_OPS_STATS,第三方應用用不了了。

ROM

有些Rom會預設禁用許可權,通常都有自帶的許可權管理

API 18+ 有些Rom會預設禁用許可權,通常都有自帶的許可權管理,這時就需要檢測Rom型別然後跳轉到對應的設定頁面

API 23+ 本來去系統設定皮膚就好了,但有些Rom會用自帶的許可權管理替代系統設定皮膚,這時仍然需要檢測Rom型別然後跳轉到對應的設定頁面

實際上是跳轉到手機上的安全中心裡對應的許可權設定頁,當安全中心版本不同時相應的許可權設定頁也有可能不一樣

還有部分ROM的應用詳細資訊頁可以設定許可權

測試

主要是測了懸浮窗許可權

裝置 系統版本 ROM版本 狀態 跳轉
華為 榮耀7i 6.0.1 4.0 預設禁用 ok
華為 榮耀暢玩5X 5.1.1 4.0.1 預設禁用 ok
華為 Ascend P7 5.1.1 3.1 預設禁用 ok
華為 榮耀6 5.1.1 3.1 預設禁用 ok
華為 榮耀6Plus 4.4.4 3.0 預設禁用 ok
華為 暢享5S 5.1 3.0 預設禁用 ok
華為 P8 5.0.1 3.1 預設可用 ok,無安全中心
小米 MI 5 6.0 V7 預設禁用 ok
小米 Note Pro 5.1.1 V8 預設禁用 ok
小米 紅米 Pro 6.0 V8 預設禁用 ok
小米 紅米1S 4.4.2 V7 預設禁用 ok
魅族 Pro5 5.1 5.1.11 預設禁用 ok
魅族 MX4 5.1 5.1.5 預設禁用 ok
魅族 魅藍Note2 5.1 5.1.5 預設禁用 ok
魅族 M1 4.4.4 4.2.1 預設可用 ok
懸浮窗不能覆蓋到其它應用上
詳情頁有懸浮窗許可權設定,禁用後無影響
錘子 堅果 5.1.1 2.5.3 預設禁用 ok
錘子 堅果 4.4.4 2.1.2 預設禁用 ok
OPPO A53 5.1.1 2.1 預設可用 ok
OPPO R7s 4.4.4 2.1 預設可用 ok
VIVO X6S Plus 5.1.1 2.5 預設可用 到達i管家主頁,未到懸浮窗管理頁
VIVO X6 5.1 2.5 預設可用 到達i管家主頁,未到懸浮窗管理頁
VIVO X5 5.0 2.5 預設可用 到達i管家主頁,未到懸浮窗管理頁
VIVO X5M 5.0.2 2.0 預設可用 ok, i管家沒有懸浮窗管理功能
VIVO Y23L 4.4.4 1.5 預設可用 ok, i管家沒有懸浮窗管理功能
奇酷 青春版 5.1 / 預設禁用 ok
奇酷 F4 5.1 / 預設禁用 ok
奇酷 N4 6.0 / 預設禁用 ok
奇酷 N4S 6.0.1 / 預設禁用 ok
三星 Galaxy S6 6.0.1 / 預設可用 ok
三星 Galaxy Note4 6.0.1 / 預設可用 ok
摩托羅拉 X Style 5.1.1 / 預設可用 ok
聯想 樂檬3 5.1.1 / 預設可用 ok
酷派 鋒尚 pro 4.4.4 / 預設可用 ok
金立 F103 5.0 / 預設可用 ok
樂視 樂 Max 6.0.1 / 預設可用 ok

百度雲真機
mtc.baidu.com/tinypace/ma…

騰訊優測真機
remote.utest.qq.com/deviceSearc…

相容庫

github.com/czy1121/set…

歡迎star,fork,issue

適配懸浮窗許可權與系統設定修改許可權
screenshot.png

API

// 檢測是否授權
SettingsCompat.canDrawOverlays(Context)
SettingsCompat.canWriteSettings(Context)

// 設定授權狀態,僅在未深度定製的 Android 4.3/4.4 上可用
SettingsCompat.setDrawOverlays(Context, boolean)
SettingsCompat.setWriteSettings(Context, boolean)

// 跳轉到懸浮窗許可權設定頁
SettingsCompat.manageDrawOverlays(Context)
// 跳轉到系統設定修改許可權設定頁,暫時只支援 Android 6.0+
SettingsCompat.manageWriteSettings(Context)複製程式碼

參考

Android 懸浮窗許可權各機型各系統適配大全
blog.csdn.net/self_study/…
github.com/zhaozepeng/…

Android M 許可權最佳實踐
chen-wei.me/2016/11/10/…

Android 許可權管理 —— AppOps
3dobe.com/archives/51…

Android 4.3 隱藏功能 App Ops 分析
mssun.me/blog/androi…

androidxref.com/4.3_r2.1/xr…

相關文章