You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Java/Kotlin编程实现RRO的启用与禁用?

RRO操作对应Android官方API说明

Android 确实提供了官方系统 API 实现 RRO 的启用、禁用等操作,不需要自行执行 adb shell 命令。

  • 对应的核心服务类是 OverlayManager,你用 adb shell cmd overlay 能实现的所有操作,OverlayManager 都有对应的方法支持,包括启用/禁用 overlay、查询 overlay 状态、设置优先级等。
  • 权限限制:该 API 属于系统隐藏 API,且调用需要持有签名级权限 android.permission.CHANGE_OVERLAY_PACKAGES,普通第三方无系统签名、非预装的应用无法直接调用。只有以下场景可以正常使用:
    • 应用为定制ROM的预装应用,且已申请对应签名权限
    • 应用运行在已 root 的设备上,可获得 root 权限执行调用

如果你符合调用权限条件,可通过反射或者引入framework开发包的方式调用,以下是 Kotlin 下的反射调用示例:

// 启用指定RRO包示例
val overlayService = context.getSystemService("overlay")
try {
    val setEnabledMethod = overlayService.javaClass.getMethod(
        "setEnabled",
        String::class.java, // 要操作的RRO应用包名
        Boolean::class.java, // 启用传true,禁用传false
        Int::class.java // 操作用户的ID,普通场景传context.userId即可
    )
    setEnabledMethod.invoke(overlayService, "你的RRO包名", true, context.userId)
} catch (e: Exception) {
    // 处理权限不足、方法不存在等异常
    e.printStackTrace()
}

如果你的应用无法获得对应的系统权限,只能通过root执行shell命令的方式实现,和adb命令逻辑一致:

// root环境下执行shell命令启用RRO示例
try {
    val process = Runtime.getRuntime().exec("su")
    val outputStream = process.outputStream
    outputStream.write("cmd overlay enable 你的RRO包名\n".toByteArray())
    outputStream.flush()
    outputStream.write("exit\n".toByteArray())
    outputStream.flush()
    process.waitFor()
} catch (e: Exception) {
    e.printStackTrace()
}

注意不同Android版本的OverlayManager方法参数可能存在差异,需要对应系统版本做适配。

内容的提问来源于stack exchange,提问作者Sawal Maskey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 17:24:05