Ai-je fait une erreur? Ça ne fonctionne pas.
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);
}
Cette réponse contient le code nécessaire pour ce faire. Assurez-vous également que vous disposez du WRITE_SETTINGS
autorisation.
Adapté de Contrôle du mode avion :
// 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);
Les éléments suivants peuvent être utilisés sur un appareil rooté.
Depuis la ligne de commande, vous pouvez activer/désactiver le mode avion avec les éléments suivants:
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
Cela fonctionne avec Android 4.4.2+
pas de racine, pas d'autorisation au niveau du système !
dans AndroidManifest.xml ajouter la permission:
<!--airplane mode-->
<uses-permission Android:name="Android.permission.WRITE_SETTINGS"/>
ensuite:
@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();
}
}
}
}
});
}
Je pense que "Settings.System.AIRPLANE_MODE_ON" est obsolète, je utilise:
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);
}
}
}
J'espère que cela aide quelqu'un.
Comme @eggyal l'a mentionné, le basculement du mode avion ne peut pas être effectué à partir de la version 4.2 et plus.
Mais ce que nous pouvons faire, c'est transformer chacun des services sans fil:
Le Wifi peut être contrôlé à l'aide de WifiService ~ getSystemService (Context.WIFI_SERVICE). Bluetooth peut être contrôlé à l'aide de BluetoothAdapterSetemService (Context.BLUETOOTH_SERVICE).
Après quelques recherches, j'ai trouvé qu'en utilisant Java Reflection, vous pouvez toujours contrôler les Android Radios (Wifi, réseau, Bluetooth) ce que le mode avion fait essentiellement est de basculer l'état) Bluetooth, Wifi et Réseaux.
Ainsi, en contrôlant les radios, vous pouvez en effet créer votre propre mode avion.
AVERTISSEMENT: l'utilisation de Reflection peut échouer sur certains périphériques (dépend de l'implémentation des classes par le fabricant).
Cet exemple de code bascule le réseau mobile:
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;
}
}
Après Lollipop, vous pouvez utiliser la méthode ci-dessous, mais c'est une API cachée et votre application nécessite une autorisation au niveau du système
<uses-permission Android:name="Android.permission.CONNECTIVITY_INTERNAL"/>
ConnectivityManager mgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
mgr.setAirplaneMode(true);
ici avant que tous les paramètres utilisent Android.provider comme ceci:
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);
}
}
Notez que, comme indiqué sous API Android 4.2 (emphase ajoutée):
Nouveaux paramètres globaux
Les paramètres système ont été mis à jour pour prendre en charge plusieurs utilisateurs avec l'ajout de
Settings.Global
. Cette collection de paramètres est similaire àSettings.Secure
paramètres car ils sont en lecture seule, mais s'appliquent globalement à tous les espaces utilisateur de l'appareil.Plusieurs paramètres existants ont été déplacés ici depuis
Settings.System
ouSettings.Secure
. Si votre application modifie actuellement les paramètres précédemment définis dansSettings.System
(commeAIRPLANE_MODE_ON
), alors vous devez vous attendre à ce que cela ne fonctionne plus sur un appareil exécutant Android 4.2 ou supérieur si ces paramètres ont été déplacés versSettings.Global
. Vous pouvez continuer à lire les paramètres qui sont dansSettings.Global
, mais car les paramètres ne sont plus considérés comme sûrs pour les applications à modifier, toute tentative échouera silencieusement et le système écrira un avertissement au journal système lors de l'exécution de votre application sur Android 4.2 ou supérieur.
Celui-ci fonctionne pour moi
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);
}
Mais vous avez besoin des autorisations système
<uses-permission Android:name="Android.permission.WRITE_SECURE_SETTINGS" />