如何通过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
相关产品推荐
相关产品推荐

