Mode avion à bascule dans Android
ai-je fait une erreur? Il 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);
}
10 réponses
Cette réponse contient le code nécessaire pour ce faire. Assurez-vous également d'avoir la permission WRITE_SETTINGS
.
adapté de Mode Avion de commande :
// 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);
ce qui suit peut être utilisé sur un dispositif enraciné .
depuis commandline, vous pouvez activer/désactiver le mode avion avec ce qui suit:
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+
je pense" paramètres.Système.AIRPLANE_MODE_ON" est déprécié, Im en utilisant:
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 aidera quelqu'un.
fonctionne pour toutes les versions API.
- switch authomaticaly for API < 17
- ouvert par Défaut de l'Activité de l'Avion mode d'action de l'utilisateur pour API >= 17
pas de racine, pas de système d'autorisation de niveau !
dans AndroidManifest.XML ajouter autorisation:
<!--airplane mode-->
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
puis:
@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();
}
}
}
}
});
}
après lollipop, vous pouvez utiliser la méthode ci-dessous, mais c'est l'api cachée et votre application a besoin d'une permission au niveau du système
<uses-permission android:name="android.permission.CONNECTIVITY_INTERNAL"/>
ConnectivityManager mgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
mgr.setAirplaneMode(true);
comme @eggyal l'a mentionné le mode avion basculant ne peut pas être fait à partir de la version 4.2 et plus.
mais ce que nous pouvons faire, c'est tourner chacun des services sans fil:
Wifi peut être contrôlé en utilisant WifiService ~ getSystemService(Context.WIFI_SERVICE). Bluetooth peut être contrôlé en utilisant BluetoothAdapter - getSystemService(Context.BLUETOOTH_SERVICE).
après quelques recherches, J'ai découvert Qu'en utilisant Java Reflection vous pouvez encore contrôler les Radios Android (Wifi, réseau, Bluetooth) ce que le Mode Avion fait essentiellement est basculer l'état de Bluetooth, Wifi et les réseaux.
ainsi, en contrôlant les Radios, vous pouvez en fait créer votre propre Mode Avion.
avertissement: L'utilisation de la réflexion peut échouer sur certains dispositifs (dépend de la mise en œuvre des classes par le fabricant).
ce 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;
}
}
ici avant chaque Paramètres utilisez android.fournisseur 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 Android 4.2 Api (nous soulignons):
Nouveaux Paramètres Globaux
les paramètres du 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 parce qu'ils sont en lecture seule, mais s'applique globalement à tous les espaces de l'utilisateur sur l'appareil.plusieurs contextes existants ont été déplacés ici de
Settings.System
ouSettings.Secure
. Si votre application est en train de modifier les paramètres définis dansSettings.System
(par exemple:AIRPLANE_MODE_ON
), puis vous devriez vous attendre à ce que cela ne fonctionnera plus sur un appareil fonctionnant sous Android 4.2 ou plus si ceux les paramètres ont été déplacés versSettings.Global
. Vous pouvez continuer à lire les paramètresSettings.Global
, mais parce que les paramètres ne sont plus considérés comme sûrs pour les applications de changer, tenter de le faire échouera silencieusement et le système écrira un avertissement au Journal du système lors de l'exécution de votre application sur Android 4.2 ou plus.
celui-ci travaille 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 de permissions système bien que
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />
j'ai trouvé cette solution de contournement pour 17+ si vous voulez arrêter l'internet.
autorisation
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
méthode
@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();
}
}