WindowManager檢視新增不顯示——懸浮窗的許可權適配問題
阿新 • • 發佈:2018-12-18
WindowManager檢視新增不顯示——懸浮窗的許可權適配問題
文章目錄
懸浮窗適配方案
目前市場上有兩種方式,第一種是正規流程,系統在沒有賦予APP懸浮窗許可權,會先跳轉到許可權授權介面,引導使用者開啟懸浮窗許可權,然後再去彈相應懸浮窗,比如QQ一些主流應用這樣做;第二種就是利用系統的漏洞,繞過許可權申請,該方法不提倡,比如UC就是這樣做,不過在一些特殊機型不行,比如miui8.
正常適配流程
Android6.0之前版本
由於google沒有對這個許可權進行單獨處理,到時不同手機廠家各自定製不同授權介面,到時適配難度增加。具體解決方案,之前看過一位博主解決方案,目前最詳細,這篇部落格文章Android 懸浮窗許可權各機型各系統適配大全。主要適配的機子有一下幾個手機廠家:小米、華為、oppo、魅族、360。詳情可以直接通過該連結查閱,博主講解很詳細。
Android6.0及之後版本
google後面對許可權問題進行嚴格控制,懸浮窗許可權在6.0以及之後版本開始單獨拿出來管理。
首先,我們必須在Mainfest靜態申請許可權
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
然後再判斷是否被授權,程式安裝預設情況下是沒有授權的。下面是是否授權程式碼
private boolean permissionCheck(Context context) { Boolean result = true; if (Build.VERSION.SDK_INT >= 23) { try { Class clazz = Settings.class; Method canDrawOverlays = clazz.getDeclaredMethod("canDrawOverlays", Context.class); result = (Boolean) canDrawOverlays.invoke(null, context); } catch (Exception e) { Log.e(TAG, Log.getStackTraceString(e)); } } return result; }
所以要動態申請,引導使用者到相應的授權介面去授權懸浮窗的許可權給APP。
public static void permissionApplyInternal(Context context) throws NoSuchFieldException, IllegalAccessException {
Class clazz = Settings.class;
Field field = clazz.getDeclaredField("ACTION_MANAGE_OVERLAY_PERMISSION");
Intent intent = new Intent(field.get(null).toString());
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setData(Uri.parse("package:" + context.getPackageName()));
context.startActivity(intent);
}