懸浮窗毁渗、后臺彈出頁面權(quán)限

華為题暖、VIVO、小米梆暮、和其他

  • 判斷是否是華為和是否是鴻蒙系統(tǒng)
fun isHuawei():Boolean{
    return ("huawei".equals(Build.BRAND, ignoreCase = true)
                || "huawei".equals(Build.MANUFACTURER, ignoreCase = true))
}

fun isHarmonyOS(): Boolean {
        try {
            val clz = Class.forName("com.huawei.system.BuildEx")
            val method = clz.getMethod("getOsBrand")
            return "harmony" == method.invoke(clz)
        } catch (e: java.lang.Exception) {
            Log.e(
                "TAG",
                "the phone not support the harmonyOS"
            )
        }
        return false
}
  • 是否是VIVO
fun isVivo():Boolean{
    return ("vivo".equals(Build.BRAND, ignoreCase = true)
                || "vivo".equals(Build.MANUFACTURER, ignoreCase = true))
}
  • 是否是小米
fun isXiaoMi():Boolean{
    return ("xiaomi".equals(Build.BRAND, ignoreCase = true)
                || "xiaomi".equals(Build.MANUFACTURER, ignoreCase = true))
}

判斷是否開啟懸浮窗和后臺彈出頁面

fun hasPermission(context:Context){
    return hasFloatPermission(context) && hasBgStartPermission(context)
}

fun hasFloatPermission(context: Context): Boolean {
        try {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                return Settings.canDrawOverlays(context)
            }
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                val manager = context.getSystemService(Context.APP_OPS_SERVICE) as AppOpsManager
                    ?: return false
                val method = AppOpsManager::class.java.getMethod(
                    "checkOp",
                    Int::class.javaPrimitiveType,
                    Int::class.javaPrimitiveType,
                    String::class.java
                )
                val result =
                    method.invoke(manager, 24, Binder.getCallingUid(), context.packageName) as Int
               return AppOpsManager.MODE_ALLOWED == result
            }
        } catch (e: java.lang.Exception) {
            e.printStackTrace()
        }
        return false
}

fun hasBgStartPermission(context: Context?): Boolean {
        if (isHuawei() && isHarmonyOS()) {
            return isHarmonyBgStartPermissionAllowed(context)
        } else if (isVivo()) {
            return isVivoBgStartPermissionAllowed(context)
        } else if (isXiaoMi()) {
            return isXiaomiBgStartPermissionAllowed(context)
        }
        return hasFloatPermission(context)
}

fun isHarmonyBgStartPermissionAllowed(context: Context): Boolean {
        try {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                val manager = context.getSystemService(Context.APP_OPS_SERVICE) as AppOpsManager
                    ?: return false
                val clz = Class.forName("com.huawei.android.app.AppOpsManagerEx")
                val method = clz.getDeclaredMethod(
                    "checkHwOpNoThrow",
                    AppOpsManager::class.java,
                    Int::class.javaPrimitiveType,
                    Int::class.javaPrimitiveType,
                    String::class.java
                )
                val result = method.invoke(
                    clz.newInstance(), *arrayOf(
                        manager, 100000,
                        Process.myUid(), context.packageName
                    )
                ) as Int
                return result == 0
            }
        } catch (e: java.lang.Exception) {
            e.printStackTrace()
        }
        return false
}

fun isVivoBgStartPermissionAllowed(context: Context): Boolean {
    return getVivoBgStartPermissionStatus(context) == 0
}
@SuppressLint("Range")
fun getVivoBgStartPermissionStatus(context: Context): Int {
    val uri: Uri = Uri.parse("content://com.vivo.permissionmanager.provider.permission/start_bg_activity")
    val selection = "pkgname = ?"
    val selectionArgs = arrayOf(context.packageName)
    var state = 1
    try {
        context.contentResolver.query(uri, null, selection, selectionArgs, null)?.use {
            if (it.moveToFirst()) {
                state = it.getInt(it.getColumnIndex("currentstate"))
            }
        }
    } catch (e: Exception) {
        e.printStackTrace()
    }
    return state
}

fun isXiaomiBgStartPermissionAllowed(context: Context): Boolean {
    val ops = context.getSystemService(Context.APP_OPS_SERVICE) as AppOpsManager
    try {
        val op = 10021
        val method: Method = ops.javaClass.getMethod("checkOpNoThrow", Int::class.javaPrimitiveType, Int::class.javaPrimitiveType, String::class.java)
        val result = method.invoke(ops, op, android.os.Process.myUid(), context.packageName) as Int
        return result == AppOpsManager.MODE_ALLOWED
    } catch (e: Exception) {
        e.printStackTrace()
    }
    return false
}
  • 跳轉(zhuǎn)系統(tǒng)設(shè)置頁面
fun startAppDetailsSettingsByBrand(context:Context){
    if(isVivo()){
        startVivoPermissionSettings(context)
    }else if(isHuawei()){
        startHuaweiPermissionSettings(context)
    }else if(isXiaoMi()){
        startXiaomiPermissionSettings(context)
    }else{
        startCommonSettings(context)
    }
}

fun startVivoPermissionSettings(context:Context){
    try {
        val intent = Intent()        
          intent.setClassName("com.vivo.permissionmanager",
          "com.vivo.permissionmanager.activity.SoftPermissionDetailActivity")
          intent.setAction("secure.intent.action.softPermissionDetail")
          intent.putExtra("packagename",context.packageName)
          intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
          context.startActivity(intent)
    } catch(e:Exception){
        startCommonSettings(context)
    }
}

fun startHuaweiPermissionSettings(context:Context){
    if(!isHarmonyOS()){
        startCommonSettings(context)
        return
    }
    try {
          val intent = Intent()        
          val comp = ComponentName("com.huawei.systemmanager",
          "com.huawei.permissionmanager.ui.MainActivity")
          intent.setComponent(comp)
          intent.putExtra("packagename",context.packageName)
          intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
          context.startActivity(intent)
    } catch(e:Exception){
        startCommonSettings(context)
    }
}

fun startXiaomiPermissionSettings(context:Context){
    try {
          val intent = Intent("miui.intent.action.APP_PERM_EDITOR")        
          intent.setClassName("com.miui.securitycenter",
          "com.miui.permcenter.permissions.PermissionsEditorActivity")
          intent.putExtra("extra_pkgname",context.packageName)
          intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
          context.startActivity(intent)
    } catch(e:Exception){
        startCommonSettings(context)
    }
}

fun startCommonSettings(context:Context){
    val intent = Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION)  
    val parse = Uri.parse("package:${context.packageName}")
    intent.setData(parse)
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
    context.startActivity(intent)
}

結(jié)束

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末服协,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子啦粹,更是在濱河造成了極大的恐慌偿荷,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件唠椭,死亡現(xiàn)場離奇詭異跳纳,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)贪嫂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進(jìn)店門寺庄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人力崇,你說我怎么就攤上這事斗塘。” “怎么了亮靴?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵馍盟,是天一觀的道長。 經(jīng)常有香客問我茧吊,道長贞岭,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任饱狂,我火速辦了婚禮曹步,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘休讳。我一直安慰自己讲婚,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布俊柔。 她就那樣靜靜地躺著筹麸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪雏婶。 梳的紋絲不亂的頭發(fā)上物赶,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天,我揣著相機(jī)與錄音留晚,去河邊找鬼酵紫。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的奖地。 我是一名探鬼主播橄唬,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼参歹!你這毒婦竟也來了仰楚?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤犬庇,失蹤者是張志新(化名)和其女友劉穎僧界,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體臭挽,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡捂襟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了埋哟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片笆豁。...
    茶點(diǎn)故事閱讀 38,789評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖赤赊,靈堂內(nèi)的尸體忽然破棺而出闯狱,到底是詐尸還是另有隱情,我是刑警寧澤抛计,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布哄孤,位于F島的核電站,受9級特大地震影響吹截,放射性物質(zhì)發(fā)生泄漏瘦陈。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一波俄、第九天 我趴在偏房一處隱蔽的房頂上張望晨逝。 院中可真熱鬧,春花似錦懦铺、人聲如沸捉貌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽趁窃。三九已至,卻和暖如春急前,著一層夾襖步出監(jiān)牢的瞬間醒陆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工裆针, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留刨摩,地道東北人寺晌。 一個(gè)月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像码邻,于是被迫代替她去往敵國和親折剃。 傳聞我的和親對象是個(gè)殘疾皇子另假,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內(nèi)容