拥有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
相关产品推荐
相关产品推荐

