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

拥有WRITE_SECURE_SETTINGS权限仍无法发送飞行模式广播,MacroDroid如何实现?

问题:MacroDroid如何成功发送飞行模式变更广播?

通过adb shell pm grant com.arlosoft.macrodroid android.permission.WRITE_SECURE_SETTINGS授予权限后,MacroDroid可以正常切换飞行模式。我自己编写了修改飞行模式状态的代码:

boolean isEnabled = Settings.Global.getInt(context.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 0) == 1; 
Settings.Global.putInt(context.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, isEnabled ? 0 : 1);

授予相同权限后,我的应用可以修改飞行模式设置,但发送状态变更广播时提示权限被拒绝,广播代码如下:

Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);  
intent.putExtra("state", !isEnabled);  
context.sendBroadcast(intent);

想请教MacroDroid是如何成功实现发送该广播并切换飞行模式的?

解决方案分析

  • 通过ADB Shell发送广播:Intent.ACTION_AIRPLANE_MODE_CHANGED属于系统级广播,普通应用即便持有WRITE_SECURE_SETTINGS权限也无法直接发送。MacroDroid可能是通过调用adb shell am broadcast -a android.intent.action.AIRPLANE_MODE --ez state [true/false]的方式来发送广播——ADB执行的操作拥有系统级权限,不会触发权限拒绝。
  • 依赖系统自动触发广播:修改Settings.Global.AIRPLANE_MODE_ON的值后,系统本身会自动检测到状态变化并发送ACTION_AIRPLANE_MODE_CHANGED广播。MacroDroid可能并没有手动发送这个广播,只是修改了设置值,剩下的广播发送由系统完成。你可以尝试移除手动发送广播的代码,仅保留修改设置的逻辑,观察系统是否会自动同步飞行模式状态。
  • 调用系统隐藏服务/API:MacroDroid可能通过反射调用了Android系统的隐藏API,比如IPowerManager服务中的飞行模式控制方法。这类方法由系统内部处理,会自动完成状态修改和广播发送,不需要应用自行发送广播。例如通过反射获取PowerManager的隐藏方法,直接调用切换飞行模式,无需手动修改设置值和发送广播。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 08:12:36