去除悬浮窗权限判断

This commit is contained in:
yitao_hello
2021-12-25 09:36:58 +08:00
committed by zu
parent c1f30d54d3
commit fdab66abb6
2 changed files with 3 additions and 68 deletions

View File

@@ -38,12 +38,6 @@ enum class PermissionEntity(
Manifest.permission.GET_ACCOUNTS
)
),
WINDOW(
"悬浮窗",
"悬浮窗口显示在其他应用上层",
R.drawable.icon_permission_common,
arrayOf(Manifest.permission.SYSTEM_ALERT_WINDOW)
),
MICROPHONE(
"录音",
"录制音频",

View File

@@ -1,15 +1,11 @@
package com.yizhuan.erban.utils
import android.Manifest
import android.app.AppOpsManager
import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
import android.net.Uri
import android.os.Binder
import android.os.Build
import android.provider.Settings
import com.microquation.linkedme.android.v4.ContextCompatLKMe
import com.yizhuan.erban.BuildConfig
import com.yizhuan.erban.ui.setting.bean.PermissionEntity
@@ -31,12 +27,8 @@ class PermissionUtil {
it
} else {
it.filter { s ->
val granted = ContextCompatLKMe.checkSelfPermission(context, s) == PackageManager.PERMISSION_GRANTED
if (s == Manifest.permission.SYSTEM_ALERT_WINDOW) {
granted && checkFloatPermission(context)
} else {
granted
}
ContextCompatLKMe.checkSelfPermission(context, s) ==
PackageManager.PERMISSION_GRANTED
}
}
}
@@ -59,58 +51,7 @@ class PermissionUtil {
else -> toCommonPermission(context)
}
}
//悬浮窗权限判断
private fun checkFloatPermission(context: Context): Boolean {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT)
return true
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
try {
val contextClazz = Context::class.java
val declaredField = contextClazz.getDeclaredField("APP_OPS_SERVICE")
declaredField.isAccessible = true
val filedValue = declaredField.get(contextClazz)
if (filedValue !is String) {
return false
}
val methodValue = contextClazz.getMethod("getSystemService", String::class.java)
.invoke(context, filedValue)
val osManagerClazz = Class.forName("android.app.AppOpsManager")
val filedMode = osManagerClazz?.getDeclaredField("MODE_ALLOWED")
filedMode?.isAccessible = true
val checkOpMethod = osManagerClazz.getMethod(
"checkOp",
Integer.TYPE,
Integer.TYPE,
String::class.java
)
val result = checkOpMethod?.invoke(
methodValue,
24,
Binder.getCallingUid(),
context.packageName
)
return result == filedMode?.getInt(osManagerClazz)
} catch (e: Exception) {
return false
}
} else {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val appOpsMgr =
context.getSystemService(Context.APP_OPS_SERVICE) as AppOpsManager
val mode = appOpsMgr?.checkOpNoThrow(
"android:system_alert_window", android.os.Process.myUid(), context
.packageName
)
mode == AppOpsManager.MODE_ALLOWED || mode == AppOpsManager.MODE_IGNORED
} else {
Settings.canDrawOverlays(context)
}
}
}
private fun toHuaWeiPermission(context: Context) {
try {
val intent = Intent()