在Android中切换飞行模式

我犯了一个错误吗? 这不起作用。

public void airplane() { boolean isEnabled = Settings.System.getInt(this.getApplicationContext().getContentResolver(), Settings.System.AIRPLANE_MODE_ON, 0) == 1; Settings.System.putInt(context.getContentResolver(),Settings.System.AIRPLANE_MODE_ON,isEnabled ? 0 : 1); //Settings.System.putInt(this.getApplicationContext().getContentResolver(),Settings.System.AIRPLANE_MODE_ON,isEnabled ? 0 : 1); Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED); } 

Solutions Collecting From Web of "在Android中切换飞行模式"

这个答案包含必要的代码来做到这一点。 还要确保你有WRITE_SETTINGS权限。

从控制飞机模式改编:

 // read the airplane mode setting boolean isEnabled = Settings.System.getInt( getContentResolver(), Settings.System.AIRPLANE_MODE_ON, 0) == 1; // toggle airplane mode Settings.System.putInt( getContentResolver(), Settings.System.AIRPLANE_MODE_ON, isEnabled ? 0 : 1); // Post an intent to reload Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED); intent.putExtra("state", !isEnabled); sendBroadcast(intent); 

以下内容可以在设备上使用。

在命令行中,您可以使用以下命令打开/closures飞行模式:

 ON: settings put global airplane_mode_on 1 am broadcast -a android.intent.action.AIRPLANE_MODE --ez state true OFF: settings put global airplane_mode_on 0 am broadcast -a android.intent.action.AIRPLANE_MODE --ez state false 

这适用于Android 4.4.2 +

我认为“Settings.System.AIRPLANE_MODE_ON”已弃用,我使用:

 public class AirplaneModeService { public boolean run(Context context) { boolean isEnabled = isAirplaneModeOn(context); // Toggle airplane mode. setSettings(context, isEnabled?1:0); // Post an intent to reload. Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED); intent.putExtra("state", !isEnabled); context.sendBroadcast(intent); return true; } public static boolean isAirplaneModeOn(Context context) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) { return Settings.System.getInt(context.getContentResolver(), Settings.System.AIRPLANE_MODE_ON, 0) != 0; } else { return Settings.Global.getInt(context.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 0) != 0; } } public static void setSettings(Context context, int value) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) { Settings.System.putInt( context.getContentResolver(), Settings.System.AIRPLANE_MODE_ON, value); } else { Settings.Global.putInt( context.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, value); } } } 

我希望这可以帮助别人。

适用于所有API版本。

  • 开关authomaticaly为API <17
  • 打开用于API> = 17的用户操作的飞行模式默认活动

没有根,没有系统级的权限


AndroidManifest.xml中添加权限:

 <!--airplane mode--> <uses-permission android:name="android.permission.WRITE_SETTINGS"/> 

然后:

 @SuppressWarnings("deprecation") private void initAirplanemodeBtn() { airplanemodeButton = (ToggleButton) findViewById(R.id.airplanemode_btn); airplanemodeButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (android.os.Build.VERSION.SDK_INT < 17) { try { // read the airplane mode setting boolean isEnabled = Settings.System.getInt( getContentResolver(), Settings.System.AIRPLANE_MODE_ON, 0) == 1; // toggle airplane mode Settings.System.putInt( getContentResolver(), Settings.System.AIRPLANE_MODE_ON, isEnabled ? 0 : 1); // Post an intent to reload Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED); intent.putExtra("state", !isEnabled); sendBroadcast(intent); } catch (ActivityNotFoundException e) { Log.e(TAG, e.getMessage()); } } else { try { Intent intent = new Intent(android.provider.Settings.ACTION_AIRPLANE_MODE_SETTINGS); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); } catch (ActivityNotFoundException e) { try { Intent intent = new Intent("android.settings.WIRELESS_SETTINGS"); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); } catch (ActivityNotFoundException ex) { Toast.makeText(buttonView.getContext(), R.string.not_able_set_airplane, Toast.LENGTH_SHORT).show(); } } } } }); } 

正如@eggyal提到的切换飞行模式不能从版本4.2和以上完成。

但是我们可以做的是把每一个无线服务:

可以使用WifiService〜getSystemService(Context.WIFI_SERVICE)来控制Wifi。 蓝牙可以使用BluetoothAdapter-getSystemService(Context.BLUETOOTH_SERVICE)进行控制。

经过一番研究,我发现使用Java Reflection,您仍然可以控制Android Radios(Wifi,networking,蓝牙),Airplane Mode基本上可以切换蓝牙,Wifi和networking的状态。

所以通过控制收音机,您可以创build自己的飞行模式。

警告:在某些设备上使用Reflection可能会失败(取决于制造商的类实现)。

此示例代码切换移动networking:

 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; } } 

这里之前每个设置使用android.provider像这样:

 public class MainActivity extends Activity implements OnClickListener { Button air; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); air = (Button) findViewById(R.id.button1); air.setOnClickListener(this); } @Override public void onClick(View arg0) { // TODO Auto-generated method stub // read the airplane mode setting boolean isEnabled = android.provider.Settings.System.getInt( getContentResolver(), android.provider.Settings.System.AIRPLANE_MODE_ON, 0) == 1; // toggle airplane mode android.provider.Settings.System.putInt( getContentResolver(), android.provider.Settings.System.AIRPLANE_MODE_ON, isEnabled ? 0 : 1); // Post an intent to reload Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED); intent.putExtra("state", !isEnabled); sendBroadcast(intent); } } 

棒棒糖之后,你可以使用下面的方法,但它是隐藏的API,你的应用程序需要系统级的权限

 <uses-permission android:name="android.permission.CONNECTIVITY_INTERNAL"/> ConnectivityManager mgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); mgr.setAirplaneMode(true); 

请注意,正如在Android 4.2 APIs (重点添加)中所logging:

新的全局设置

系统设置已更新,以支持多个用户,并添加Settings.Global 。 这些设置的集合类似于Settings.Secure设置,因为它们是只读的,但在设备上的所有用户空间中全局应用。

几个现有的设置从Settings.SystemSettings.Secure重新定位在这里。 如果您的应用程序当前正在对Settings.System (如AIRPLANE_MODE_ON )中以前定义的Settings.System进行更改,那么如果这些设置已移至Settings.Global ,那么您应该期望这样做将不再适用于运行Android 4.2或更高版本的设备 。 您可以继续阅读Settings.Global中的Settings.Global ,但是由于设置不再适合应用程序更改,因此尝试执行此操作将会失败 ,系统会在运行应用程序时向系统日志中写入警告Android 4.2或更高版本。

这个为我工作

 public static boolean isAirplaneModeOn() { return Settings.System.getInt(mContext.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 0) != 0; } public static void setAirPlaneMode(boolean airplaneMode) { Logger.d(LOG_TAG + "setAirPlaneMode airplaneMode: " + airplaneMode) ; int state = airplaneMode ? 1 : 0; Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, state); Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED); intent.putExtra("state", state); mContext.sendBroadcast(intent); } 

但是你需要系统权限

 <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" /> 

我发现这个解决方法17 +,如果你想closures互联网这将工作。

允许

 <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> 

方法

 @SuppressWarnings({ "unchecked", "rawtypes" }) private void setMobileDataEnabled(boolean state) { 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 setMobileDataEnabledMethod = iConnectivityManagerClass.getDeclaredMethod("setMobileDataEnabled", Boolean.TYPE); setMobileDataEnabledMethod.setAccessible(true); setMobileDataEnabledMethod.invoke(iConnectivityManager, state); } catch (Exception e) { e.printStackTrace(); } }