去除悬浮窗权限判断
This commit is contained in:
@@ -38,12 +38,6 @@ enum class PermissionEntity(
|
|||||||
Manifest.permission.GET_ACCOUNTS
|
Manifest.permission.GET_ACCOUNTS
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
WINDOW(
|
|
||||||
"悬浮窗",
|
|
||||||
"悬浮窗口显示在其他应用上层",
|
|
||||||
R.drawable.icon_permission_common,
|
|
||||||
arrayOf(Manifest.permission.SYSTEM_ALERT_WINDOW)
|
|
||||||
),
|
|
||||||
MICROPHONE(
|
MICROPHONE(
|
||||||
"录音",
|
"录音",
|
||||||
"录制音频",
|
"录制音频",
|
||||||
|
@@ -1,15 +1,11 @@
|
|||||||
package com.yizhuan.erban.utils
|
package com.yizhuan.erban.utils
|
||||||
|
|
||||||
import android.Manifest
|
|
||||||
import android.app.AppOpsManager
|
|
||||||
import android.content.ComponentName
|
import android.content.ComponentName
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.content.pm.PackageManager
|
import android.content.pm.PackageManager
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import android.os.Binder
|
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
import android.provider.Settings
|
|
||||||
import com.microquation.linkedme.android.v4.ContextCompatLKMe
|
import com.microquation.linkedme.android.v4.ContextCompatLKMe
|
||||||
import com.yizhuan.erban.BuildConfig
|
import com.yizhuan.erban.BuildConfig
|
||||||
import com.yizhuan.erban.ui.setting.bean.PermissionEntity
|
import com.yizhuan.erban.ui.setting.bean.PermissionEntity
|
||||||
@@ -31,12 +27,8 @@ class PermissionUtil {
|
|||||||
it
|
it
|
||||||
} else {
|
} else {
|
||||||
it.filter { s ->
|
it.filter { s ->
|
||||||
val granted = ContextCompatLKMe.checkSelfPermission(context, s) == PackageManager.PERMISSION_GRANTED
|
ContextCompatLKMe.checkSelfPermission(context, s) ==
|
||||||
if (s == Manifest.permission.SYSTEM_ALERT_WINDOW) {
|
PackageManager.PERMISSION_GRANTED
|
||||||
granted && checkFloatPermission(context)
|
|
||||||
} else {
|
|
||||||
granted
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -59,58 +51,7 @@ class PermissionUtil {
|
|||||||
else -> toCommonPermission(context)
|
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) {
|
private fun toHuaWeiPermission(context: Context) {
|
||||||
try {
|
try {
|
||||||
val intent = Intent()
|
val intent = Intent()
|
||||||
|
Reference in New Issue
Block a user