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…
相容庫
歡迎star,fork,issue
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…