Android8.0許可權-懸浮窗開啟遇到的問題
阿新 • • 發佈:2019-01-10
我解決這個問題是看的別人的部落格解決的.這裡只是用來記錄一下加深這個問題的印象,這裡放上地址:https://blog.csdn.net/lovedou0816/article/details/79253710
我開始是用的github上的一個開源庫來申請懸浮窗許可權的,但是當我開啟了許可權後這個第三方庫返回的結果還是我未開啟懸浮窗許可權,所以我就只能自己寫了。
上程式碼:
public boolean checkFloatPermission(Context context) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) return true; if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { try { Class cls = Class.forName("android.content.Context"); Field declaredField = cls.getDeclaredField("APP_OPS_SERVICE"); declaredField.setAccessible(true); Object obj = declaredField.get(cls); if (!(obj instanceof String)) { return false; } String str2 = (String) obj; obj = cls.getMethod("getSystemService", String.class).invoke(context, str2); cls = Class.forName("android.app.AppOpsManager"); Field declaredField2 = cls.getDeclaredField("MODE_ALLOWED"); declaredField2.setAccessible(true); Method checkOp = cls.getMethod("checkOp", Integer.TYPE, Integer.TYPE, String.class); int result = (Integer) checkOp.invoke(obj, 24, Binder.getCallingUid(), context.getPackageName()); return result == declaredField2.getInt(cls); } catch (Exception e) { return false; } } else { /*if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { AppOpsManager appOpsMgr = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE); if (appOpsMgr == null) return false; int mode = appOpsMgr.checkOpNoThrow("android:system_alert_window", android.os.Process.myUid(), context.getPackageName()); return (mode == AppOpsManager.MODE_ALLOWED); } else {*/ return Settings.canDrawOverlays(context); // } } }
使用google提供的android 6.0以及以後可以使用的介面Settings.canDrawOverlays(context)來進行許可權是否開啟的判斷,有些8.0手機的話是需要開啟註釋中的程式碼才能正確的返回許可權是否開啟了的,而有的手機是不需要的。不過我測試的時候是沒有放開註釋程式碼返回的許可權狀態才正確,加上反而不正確了,所以我是把這一段程式碼給註釋了直接return Settings.canDrawOverlays(context)的!
之後你再在你需要使用懸浮窗的地方呼叫這個方法就可以了.如果對返回的狀態不明白,可以去上面的連結中看看,他的文章中有對狀態的詳細描述.
寫的不好 ,純屬個人所遇到的問題記錄!!!!!!!