關於懸浮窗Settings.canDrawOverlays獲取權限是否開通出錯

申請權限:

private static final int PermissionRequestCode = 10;
Intent intent = new Intent();
intent.setAction(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
intent.setData(Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, PermissionRequestCode);

獲取是否開通:

Handler mHandler;
@Override
protected void onActivityResult(final int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (mHandler == null){
        mHandler = new Handler(Looper.getMainLooper());
    }
    mHandler.postDelayed(new Runnable() {
        @Override
        public void run() {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && requestCode == PermissionRequestCode){
                boolean nOpen = Settings.canDrawOverlays(XXXActivity.this);
                if (nOpen){
                    //開啓
                }else {
                    //關閉
                }
                Log.e("PermissionRequest", "open = " + nOpen);
            }
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && requestCode == PermissionRequestCode){
                AppOpsManager appOpsMgr = (AppOpsManager) getSystemService(Context.APP_OPS_SERVICE);
                int mode = appOpsMgr.checkOpNoThrow("android:system_alert_window", android.os.Process.myUid(), getPackageName());
                if (mode == 1 || mode == 0){
                    //權限已開起
                }else if (mode == 2){
                    //權限已關閉
                }
                Log.e("PermissionRequest", "mode = " + mode);
                //此方法不可行,親測華爲8.0手機  未申請狀態時  也返回1
            }
        }
    }, 500);
}

根據https://www.jianshu.com/p/2d35c0c7316a所說,獲取權限與activity生命週期有關,google的問題?

表示不理解,反正延時0.5秒再獲取,就對了。

直接獲取的話,得到的結果是仍然沒有開通權限。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章