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

