去除悬浮窗权限判断
This commit is contained in:
@@ -38,12 +38,6 @@ enum class PermissionEntity(
|
||||
Manifest.permission.GET_ACCOUNTS
|
||||
)
|
||||
),
|
||||
WINDOW(
|
||||
"悬浮窗",
|
||||
"悬浮窗口显示在其他应用上层",
|
||||
R.drawable.icon_permission_common,
|
||||
arrayOf(Manifest.permission.SYSTEM_ALERT_WINDOW)
|
||||
),
|
||||
MICROPHONE(
|
||||
"录音",
|
||||
"录制音频",
|
||||
|
@@ -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()
|
||||
|
Reference in New Issue
Block a user