未分类 · 2022年4月22日 0

Android跳转应用权限设置(适配各产商)

内容纲要
import android.content.ComponentName
import android.content.Intent
import android.net.Uri
import android.os.Build
import android.util.Log
import java.io.BufferedReader
import java.io.IOException

object PermissionsSettingUtil {
    /**
     * Build.MANUFACTURER判断各大手机厂商品牌
     */
    private const val MANUFACTURER_HUAWEI = "huawei" //华为
    private const val MANUFACTURER_MEIZU = "meizu" //魅族
    private const val MANUFACTURER_XIAOMI = "xiaomi" //小米
    private const val MANUFACTURER_SONY = "sony" //索尼
    private const val MANUFACTURER_OPPO = "oppo"
    private const val MANUFACTURER_LG = "lg"
    private const val MANUFACTURER_LETV = "letv" //乐视

    /**
     * 跳转到相应品牌手机系统权限设置页,如果跳转不成功,则跳转到应用详情页
     * 这里需要改造成返回true或者false,应用详情页:true,应用权限页:false
     */
    fun getAppPermissionsSettingIntent(): Intent {
        return when (Build.MANUFACTURER.toLowerCase()) {
            MANUFACTURER_HUAWEI -> huawei()
            MANUFACTURER_MEIZU -> meizu()
            MANUFACTURER_XIAOMI -> xiaomi()
            MANUFACTURER_SONY -> sony()
            MANUFACTURER_OPPO -> oppo()
            MANUFACTURER_LG -> lg()
            MANUFACTURER_LETV -> letv()
            else -> getAppDetailSettingIntent()
        }
    }

    /**
     * 华为跳转权限设置页
     */
    private fun huawei(): Intent {
        val intent = Intent()
        intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
        intent.putExtra("packageName", BuildConfig.APPLICATION_ID)
        val comp = ComponentName(
            "com.huawei.systemmanager",
            "com.huawei.permissionmanager.ui.MainActivity"
        )
        intent.component = comp
        return intent
    }

    /**
     * 魅族跳转权限设置页,测试时,点击无反应,具体原因不明
     */
    private fun meizu(): Intent {
        val intent = Intent("com.meizu.safe.security.SHOW_APPSEC")
        intent.addCategory(Intent.CATEGORY_DEFAULT)
        intent.putExtra("packageName", BuildConfig.APPLICATION_ID)
        return intent
    }

    private fun xiaomi(): Intent {
        val intent = Intent("miui.intent.action.APP_PERM_EDITOR").putExtra(
            "extra_pkgname",
            BuildConfig.APPLICATION_ID
        )
        getMIUIVersion()?.let {
            val versionCode = it.trimStart('V').toIntOrNull()
            versionCode?.let {
                Log.d("version: ",it.toString())
                return intent.setClassName(
                    "com.miui.securitycenter",
                    if (it >= 8)  "com.miui.permcenter.permissions.PermissionsEditorActivity"
                    else "com.miui.permcenter.permissions.AppPermissionsEditorActivity"
                )
            }
        }
        return intent.setClassName(
            "com.miui.securitycenter",
            "com.miui.permcenter.permissions.PermissionsEditorActivity"
        )
    }

    /**
     * 索尼,6.0以上的手机非常少,基本没看见
     */
    private fun sony(): Intent {
        val intent = Intent()
        intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
        intent.putExtra("packageName", BuildConfig.APPLICATION_ID)
        val comp = ComponentName("com.sonymobile.cta", "com.sonymobile.cta.SomcCTAMainActivity")
        intent.component = comp
        return intent
    }

    /**
     * OPPO
     */
    private fun oppo(): Intent {
        val intent = Intent()
        intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
        intent.putExtra("packageName", BuildConfig.APPLICATION_ID)
        val comp = ComponentName(
            "com.color.safecenter",
            "com.color.safecenter.permission.PermissionManagerActivity"
        )
        intent.component = comp
        return intent
    }

    /**
     * LG经过测试,正常使用
     */
    private fun lg(): Intent {
        val intent = Intent("android.intent.action.MAIN")
        intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
        intent.putExtra("packageName", BuildConfig.APPLICATION_ID)
        val comp = ComponentName(
            "com.android.settings",
            "com.android.settings.Settings\$AccessLockSummaryActivity"
        )
        intent.component = comp
        return intent
    }

    /**
     * 乐视6.0以上很少,基本都可以忽略了,现在乐视手机不多
     */
    private fun letv(): Intent {
        val intent = Intent()
        intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
        intent.putExtra("packageName", BuildConfig.APPLICATION_ID)
        val comp = ComponentName(
            "com.letv.android.letvsafe",
            "com.letv.android.letvsafe.PermissionAndApps"
        )
        intent.component = comp
        return intent
    }

    /**
     * 只能打开到自带安全软件
     */
    private fun `360`(): Intent {
        val intent = Intent("android.intent.action.MAIN")
        intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
        intent.putExtra("packageName", BuildConfig.APPLICATION_ID)
        val comp = ComponentName(
            "com.qihoo360.mobilesafe",
            "com.qihoo360.mobilesafe.ui.index.AppEnterActivity"
        )
        intent.component = comp
        return intent
    }

    /**
     * 获取应用详情页面
     */
    fun getAppDetailSettingIntent(): Intent {
        val localIntent = Intent()
        localIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
        localIntent.action = "android.settings.APPLICATION_DETAILS_SETTINGS"
        localIntent.data = Uri.fromParts("package", BuildConfig.APPLICATION_ID, null)
        return localIntent
    }

    private fun getMIUIVersion(): String? {
        return getSystemProperty("ro.miui.ui.version.name")
    }

    private fun getSystemProperty(propName: String): String? {
        var input: BufferedReader? = null
        return try {
            val p = Runtime.getRuntime().exec("getprop $propName")
            input = p.inputStream.bufferedReader()
            input.readLine()
        } catch (ex: IOException) {
            ex.printStackTrace()
            null
        } finally {
            try {
                input?.close()
            } catch (e: IOException) {
                e.printStackTrace()
            }
        }
    }

}