@eggyal が言及したように、機内モードの切り替えはバージョン 4.2 以降では実行できません。
しかし、私たちができることは、各ワイヤレス サービスを次のように変更することです。
Wifi は、WifiService ~ getSystemService(Context.WIFI_SERVICE) を使用して制御できます。Bluetooth は、BluetoothAdaptergetSystemService(Context.BLUETOOTH_SERVICE) を使用して制御できます。
いくつかの調査の結果、Java Reflection を使用しても Android ラジオ (Wifi、ネットワーク、Bluetooth) を制御できることがわかりました。機内モードは基本的に、Bluetooth、Wifi、およびネットワークの状態を切り替えます。
したがって、ラジオを制御することで、実際に独自の機内モードを作成できます。
警告: Reflection を使用すると、一部のデバイスで失敗する場合があります (クラスのメーカーの実装によって異なります)。
このサンプル コードは、モバイル ネットワークを切り替えます。
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;
}
}