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

如何在Android Studio中通过代码控制Aeroplane mode与移动数据开关

安卓系统控制飞行模式与蜂窝移动数据的可用实现方案

首先明确核心前提:从Android 4.2(API 17)开始,谷歌收紧了系统设置修改权限,普通第三方应用无法直接通过公开API控制飞行模式和蜂窝移动数据开关,仅两类应用可实现该需求:

  • 系统签名级应用、或被纳入系统特权列表的应用
  • 运行在已Root设备上的应用

一、系统签名/特权应用实现方案

该方案适配Android 4.2到最新Android 14版本,需要先在AndroidManifest.xml中申请对应的系统级权限:

<!-- 控制飞行模式需要的权限 -->
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />
<!-- 控制蜂窝移动数据需要的额外权限 -->
<uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />

1. 飞行模式控制代码示例(Kotlin)

fun setAirplaneMode(context: Context, isEnable: Boolean) {
    // 修改全局设置项的飞行模式状态
    Settings.Global.putInt(
        context.contentResolver,
        Settings.Global.AIRPLANE_MODE_ON,
        if (isEnable) 1 else 0
    )
    // 发送系统广播通知状态变更
    val intent = Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED)
    intent.putExtra("state", isEnable)
    context.sendBroadcast(intent)
}

2. 蜂窝移动数据控制代码示例(Kotlin)

fun setMobileData(context: Context, isEnable: Boolean) {
    val telephonyManager = context.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
    // 反射调用系统隐藏API修改移动数据状态
    val setDataMethod = telephonyManager.javaClass.getDeclaredMethod("setDataEnabled", Boolean::class.javaPrimitiveType)
    setDataMethod.isAccessible = true
    setDataMethod.invoke(telephonyManager, isEnable)
}

二、Root设备实现方案

已Root的设备不需要申请系统权限,直接通过su命令执行系统操作即可,适配所有支持Root的安卓版本。

1. 飞行模式控制代码示例

// 开启飞行模式
fun enableAirplaneModeByRoot() {
    Runtime.getRuntime().exec(arrayOf("su", "-c", "settings put global airplane_mode_on 1"))
    Runtime.getRuntime().exec(arrayOf("su", "-c", "am broadcast -a android.intent.action.AIRPLANE_MODE_CHANGED --ez state true"))
}

// 关闭飞行模式
fun disableAirplaneModeByRoot() {
    Runtime.getRuntime().exec(arrayOf("su", "-c", "settings put global airplane_mode_on 0"))
    Runtime.getRuntime().exec(arrayOf("su", "-c", "am broadcast -a android.intent.action.AIRPLANE_MODE_CHANGED --ez state false"))
}

2. 蜂窝移动数据控制代码示例

// 开启蜂窝移动数据
fun enableMobileDataByRoot() {
    Runtime.getRuntime().exec(arrayOf("su", "-c", "svc data enable"))
}

// 关闭蜂窝移动数据
fun disableMobileDataByRoot() {
    Runtime.getRuntime().exec(arrayOf("su", "-c", "svc data disable"))
}

三、普通第三方应用替代方案

如果应用无法获取系统权限也不要求设备Root,只能引导用户跳转至系统设置页手动操作,该方法无权限限制、全版本适配:

// 跳转飞行模式设置页
fun jumpToAirplaneSettings(context: Context) {
    context.startActivity(Intent(Settings.ACTION_AIRPLANE_MODE_SETTINGS))
}

// 跳转移动网络设置页
fun jumpToMobileDataSettings(context: Context) {
    context.startActivity(Intent(Settings.ACTION_NETWORK_OPERATOR_SETTINGS))
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 17:54:03