1. 程式人生 > >WindowManager檢視新增不顯示——懸浮窗的許可權適配問題

WindowManager檢視新增不顯示——懸浮窗的許可權適配問題

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);
    }