正如@eggyal 提到的,在 4.2 及更高版本中无法切换飞行模式。
但是我们能做的就是把每一个无线服务都转起来:
Wifi 可以使用 WifiService ~ getSystemService(Context.WIFI_SERVICE) 来控制。可以使用 BluetoothAdapter-getSystemService(Context.BLUETOOTH_SERVICE) 控制蓝牙。
经过一些研究,我发现使用 Java 反射仍然可以控制 Android 无线电(Wifi、网络、蓝牙),飞行模式基本上所做的就是切换蓝牙、Wifi 和网络的状态。
因此,通过控制收音机,您实际上可以创建自己的飞行模式。
警告:在某些设备上使用反射可能会失败(取决于类的制造商实现)。
此示例代码切换移动网络:
private void setMobileRadioEnabled(boolean enabled) {
try {
final ConnectivityManager conman = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
final Class conmanClass = Class.forName(conman.getClass().getName());
final Field iConnectivityManagerField = conmanClass.getDeclaredField("mService");
iConnectivityManagerField.setAccessible(true);
final Object iConnectivityManager = iConnectivityManagerField.get(conman);
final Class iConnectivityManagerClass = Class.forName(iConnectivityManager.getClass().getName());
final Method setRadio = iConnectivityManagerClass.getDeclaredMethod("setRadio", Integer.TYPE , Boolean.TYPE);
setRadio.setAccessible(true);
for (NetworkInfo networkInfo : conman.getAllNetworkInfo()) {
if(isNetworkTypeMobile(networkInfo.getType())) {
setRadio.invoke(iConnectivityManager, networkInfo.getType(), enabled);
}
}
} catch (Exception e) {
Log.e(TAG, "Opss...", e);
}
}
public static boolean isNetworkTypeMobile(int networkType) {
switch (networkType) {
case ConnectivityManager.TYPE_MOBILE:
case ConnectivityManager.TYPE_MOBILE_MMS:
case ConnectivityManager.TYPE_MOBILE_SUPL:
case ConnectivityManager.TYPE_MOBILE_DUN:
case ConnectivityManager.TYPE_MOBILE_HIPRI:
case 10:
case 11:
case 12:
case 14:
return true;
default:
return false;
}
}