Android 6.0 的 特殊權(quán)限(Special Permissions) 包括
- 懸浮窗權(quán)限(SYSTEM_ALERT_WINDOW)
- 系統(tǒng)設(shè)置修改權(quán)限(WRITE_SETTINGS)
Android 6.0以前只要在manifest中申請了權(quán)限就是默認(rèn)開啟的
Android 6.0+需要在manifest中申請并且通過發(fā)送Intent讓用戶在設(shè)置界面進(jìn)行勾選
適配
檢測
- API 23+(Android 6.0+/M) 使用
Settings.canDrawOverlays,Settings.System.canWrite - API 18+(Android 4.3+/JellyBean MR2) 通過反射使用
AppOpsManager.checkOp - API < 18 默認(rèn)權(quán)限開啟,時始終返回 true
授權(quán)
- API 23+(Android 6.0+/M) 去系統(tǒng)設(shè)置面板就好
new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION)
new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS)
- API 18+(Android 4.3+/JellyBean MR2) 默認(rèn)權(quán)限開啟
- API < 18 默認(rèn)權(quán)限開啟,不做任何處理
切換授權(quán)狀態(tài)
AppOpsManager.setMode 可用于Android 4.3/4.4修改授權(quán)狀態(tài)
API 18 添加AppOpsManager(被隱藏,在Android 4.4公開)
API 21 后需要簽名驗(yàn)證的權(quán)限android.Manifest.permission.UPDATE_APP_OPS_STATS,第三方應(yīng)用用不了了。
ROM
API 18+ 有些Rom會默認(rèn)禁用權(quán)限,通常都有自帶的權(quán)限管理,這時就需要檢測Rom類型然后跳轉(zhuǎn)到對應(yīng)的設(shè)置頁面
API 23+ 本來去系統(tǒng)設(shè)置面板就好了,但有些Rom會用自帶的權(quán)限管理替代系統(tǒng)設(shè)置面板,這時仍然需要檢測Rom類型然后跳轉(zhuǎn)到對應(yīng)的設(shè)置頁面
實(shí)際上是跳轉(zhuǎn)到手機(jī)上的安全中心里對應(yīng)的權(quán)限設(shè)置頁,當(dāng)安全中心版本不同時相應(yīng)的權(quán)限設(shè)置頁也有可能不一樣
還有部分ROM的應(yīng)用詳細(xì)信息頁可以設(shè)置權(quán)限
測試
主要是測了懸浮窗權(quán)限
| 設(shè)備 | 系統(tǒng)版本 | ROM版本 | 默認(rèn) | 跳轉(zhuǎn) |
|---|---|---|---|---|
| 華為 榮耀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 |
| 華為 暢享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 |
| 魅族 魅藍(lán)Note2 | 5.1 | 5.1.5 | 禁用 | ok |
| 魅族 M1 | 4.4.4 | 4.2.1 | 可用 | ok 懸浮窗不能覆蓋到其它應(yīng)用上 詳情頁有懸浮窗權(quán)限設(shè)置 禁用后無影響 |
| 錘子 堅(jiān)果 | 5.1.1 | 2.5.3 | 禁用 | fail 到達(dá)懸浮窗管理頁,但隨后奔潰 |
| 錘子 堅(jiān)果 | 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 | 可用 | 到達(dá)i管家主頁未到懸浮窗管理頁 |
| VIVO X6 | 5.1 | 2.5 | 可用 | 到達(dá)i管家主頁未到懸浮窗管理頁 |
| VIVO X5 | 5.0 | 2.5 | 可用 | 到達(dá)i管家主頁未到懸浮窗管理頁 |
| VIVO X5M | 5.0.2 | 2.0 | 可用 | oki管家無懸浮窗管理 |
| VIVO Y23L | 4.4.4 | 1.5 | 可用 | oki管家無懸浮窗管理 |
| 三星 Galaxy S6 | 6.0.1 | / | 可用 | ok |
| 三星 Galaxy Note4 | 6.0.1 | / | 可用 | ok |
| 摩托羅拉 X Style | 5.1.1 | / | 可用 | ok |
| 聯(lián)想 樂檬3 | 5.1.1 | / | 可用 | ok |
| 酷派 鋒尚 pro | 4.4.4 | / | 可用 | ok |
| 金立 F103 | 5.0 | / | 可用 | ok |
| 樂視 樂 Max | 6.0.1 | / | 可用 | ok |
百度云真機(jī)
http://mtc.baidu.com/tinypace/main#/?from=DaoHang
騰訊優(yōu)測真機(jī)
http://remote.utest.qq.com/deviceSearch?type=remote
兼容庫
https://github.com/czy1121/settingscompat
歡迎star,fork,issue

API
// 檢測是否授權(quán)
SettingsCompat.canDrawOverlays(Context)
SettingsCompat.canWriteSettings(Context)
// 設(shè)置授權(quán)狀態(tài),僅在未深度定制的 Android 4.3/4.4 上可用
SettingsCompat.setDrawOverlays(Context, boolean)
SettingsCompat.setWriteSettings(Context, boolean)
// 跳轉(zhuǎn)到懸浮窗權(quán)限設(shè)置頁
SettingsCompat.manageDrawOverlays(Context)
// 跳轉(zhuǎn)到系統(tǒng)設(shè)置修改權(quán)限設(shè)置頁,暫時只支持 Android 6.0+
SettingsCompat.manageWriteSettings(Context)
參考
Android 懸浮窗權(quán)限各機(jī)型各系統(tǒng)適配大全
http://blog.csdn.net/self_study/article/details/52859790
https://github.com/zhaozepeng/FloatWindowPermission
Android M 權(quán)限最佳實(shí)踐
http://chen-wei.me/2016/11/10/android-permission-best-practice/
Android 權(quán)限管理 —— AppOps
http://3dobe.com/archives/51/
Android 4.3 隱藏功能 App Ops 分析
https://mssun.me/blog/android-4-3-app-ops-analysis.html
http://androidxref.com/4.3_r2.1/xref/frameworks/base/core/java/android/app/AppOpsManager.java