lmw
2025-04-24 718f31c92e2029d05260810435a2c70cef6e6ce5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
package com.lzf.easyfloat.permission
 
import android.app.Activity
import android.app.Fragment
import android.content.Context
import android.content.Intent
import android.net.Uri
import android.os.Build
import android.provider.Settings
import android.util.Log
import com.lzf.easyfloat.interfaces.OnPermissionResult
import com.lzf.easyfloat.permission.rom.*
import com.lzf.easyfloat.utils.Logger
 
/**
 * @author: liuzhenfeng
 * @function: 悬浮窗权限工具类
 * @date: 2019-07-15  10:22
 */
object PermissionUtils {
 
    internal const val requestCode = 199
    private const val TAG = "PermissionUtils--->"
 
    /**
     * 检测是否有悬浮窗权限
     * 6.0 版本之后由于 google 增加了对悬浮窗权限的管理,所以方式就统一了
     */
    @JvmStatic
    fun checkPermission(context: Context): Boolean =
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) when {
            RomUtils.checkIsHuaweiRom() -> huaweiPermissionCheck(context)
            RomUtils.checkIsMiuiRom() -> miuiPermissionCheck(context)
            RomUtils.checkIsOppoRom() -> oppoROMPermissionCheck(context)
            RomUtils.checkIsMeizuRom() -> meizuPermissionCheck(context)
            RomUtils.checkIs360Rom() -> qikuPermissionCheck(context)
            else -> true
        } else commonROMPermissionCheck(context)
 
    /**
     * 申请悬浮窗权限
     */
    @JvmStatic
    fun requestPermission(activity: Activity, onPermissionResult: OnPermissionResult) =
        PermissionFragment.requestPermission(activity, onPermissionResult)
 
    internal fun requestPermission(fragment: Fragment) =
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) when {
            RomUtils.checkIsHuaweiRom() -> HuaweiUtils.applyPermission(fragment)
            RomUtils.checkIsMiuiRom() -> MiuiUtils.applyMiuiPermission(fragment)
            RomUtils.checkIsOppoRom() -> OppoUtils.applyOppoPermission(fragment)
            RomUtils.checkIsMeizuRom() -> MeizuUtils.applyPermission(fragment)
            RomUtils.checkIs360Rom() -> QikuUtils.applyPermission(fragment)
            else -> Logger.i(TAG, "原生 Android 6.0 以下无需权限申请")
        } else commonROMPermissionApply(fragment)
 
    private fun huaweiPermissionCheck(context: Context) =
        HuaweiUtils.checkFloatWindowPermission(context)
 
    private fun miuiPermissionCheck(context: Context) =
        MiuiUtils.checkFloatWindowPermission(context)
 
    private fun meizuPermissionCheck(context: Context) =
        MeizuUtils.checkFloatWindowPermission(context)
 
    private fun qikuPermissionCheck(context: Context) =
        QikuUtils.checkFloatWindowPermission(context)
 
    private fun oppoROMPermissionCheck(context: Context) =
        OppoUtils.checkFloatWindowPermission(context)
 
    /**
     * 6.0以后,通用悬浮窗权限检测
     * 但是魅族6.0的系统这种方式不好用,需要单独适配一下
     */
    private fun commonROMPermissionCheck(context: Context): Boolean =
        if (RomUtils.checkIsMeizuRom()) meizuPermissionCheck(context) else {
            var result = true
            if (Build.VERSION.SDK_INT >= 23) try {
                val clazz = Settings::class.java
                val canDrawOverlays =
                    clazz.getDeclaredMethod("canDrawOverlays", Context::class.java)
                result = canDrawOverlays.invoke(null, context) as Boolean
            } catch (e: Exception) {
                Log.e(TAG, Log.getStackTraceString(e))
            }
            result
        }
 
    /**
     * 通用 rom 权限申请
     */
    private fun commonROMPermissionApply(fragment: Fragment) = when {
        // 这里也一样,魅族系统需要单独适配
        RomUtils.checkIsMeizuRom() -> MeizuUtils.applyPermission(fragment)
        Build.VERSION.SDK_INT >= Build.VERSION_CODES.M -> try {
            commonROMPermissionApplyInternal(fragment)
        } catch (e: Exception) {
            Logger.e(TAG, Log.getStackTraceString(e))
        }
        // 需要做统计效果
        else -> Logger.d(TAG, "user manually refuse OVERLAY_PERMISSION")
    }
 
    @JvmStatic
    fun commonROMPermissionApplyInternal(fragment: Fragment) = try {
        val clazz = Settings::class.java
        val field = clazz.getDeclaredField("ACTION_MANAGE_OVERLAY_PERMISSION")
        val intent = Intent(field.get(null).toString())
        intent.data = Uri.parse("package:${fragment.activity.packageName}")
        fragment.startActivityForResult(intent, requestCode)
    } catch (e: Exception) {
        Logger.e(TAG, "$e")
    }
 
}