Bien que ce soit un "duplicata", les réponses actuelles sont obsolètes et ne sont généralement plus applicables. J'ai pensé qu'il serait bon de fournir ici une ressource mise à jour, si possible, pour faire gagner du temps aux gens, comme je viens de le faire, à la recherche de ce problème.
Je suis allé sur Google pour voir les dernières informations sur la possibilité d'activer et de désactiver les données mobiles depuis une application (si le wifi n'est pas disponible).
C'est l'une des dernières choses que je peux trouver:
Saviez-vous que vous ne pouvez plus désactiver/activer les données sur Lollipop à partir d'un widget?
Il y a une réponse à cela, je cite:
Il n'y a jamais eu d'API pour cela. Les développeurs utilisaient une solution de contournement en appelant la méthode via Reflections. Tout ce que Google a fait était proche de cet "exploit".
Il y a aussi cette discussion:
Remplacement de setMobileDataEnabled () api
Ce qui est février 2015.
Il y a ces questions ici:
Comment désactiver les données mobiles sur Android
Cela a été demandé en 2010 et la dernière réponse a été mise à jour avec une ligne en décembre 2014.
Activer/désactiver la connexion de données dans Android par programme
Et ceci, la réponse acceptée en 2012.
Quoi de neuf sur cette question?
Peut-on encore le faire?
J'utilise une solution de contournement qui ne fonctionne que pour root phones.
La méthode setMobileDataEnabled
a été supprimée de ConnectivityManager
, mais deux méthodes getDataEnabled
et setDataEnabled
ont été ajoutées à TelephonyManager
pour cette fonctionnalité.
public void setMobileDataState(boolean mobileDataEnabled)
{
try
{
TelephonyManager telephonyService = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
Method setMobileDataEnabledMethod = telephonyService.getClass().getDeclaredMethod("setDataEnabled", boolean.class);
if (null != setMobileDataEnabledMethod)
{
setMobileDataEnabledMethod.invoke(telephonyService, mobileDataEnabled);
}
}
catch (Exception ex)
{
Log.e(TAG, "Error setting mobile data state", ex);
}
}
public boolean getMobileDataState()
{
try
{
TelephonyManager telephonyService = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
Method getMobileDataEnabledMethod = telephonyService.getClass().getDeclaredMethod("getDataEnabled");
if (null != getMobileDataEnabledMethod)
{
boolean mobileDataEnabled = (Boolean) getMobileDataEnabledMethod.invoke(telephonyService);
return mobileDataEnabled;
}
}
catch (Exception ex)
{
Log.e(TAG, "Error getting mobile data state", ex);
}
return false;
}
Mais vous devez ajouter cette autorisation ( MODIFY_PHONE_STATE ) au fichier Manifest, sinon vous obtiendrez une SecurityException.
Cela ne fonctionnera pas sur les téléphones non rootés car ils ont ajouté la vérification de l'autorisation MODIFY_PHONE_STATE
. Cette autorisation est uniquement accordée aux applications système ou aux applications de signature. - ici .
Vérifiez le code ci-dessous dans PhoneInterfaceManager :
1853 @Override
1854 public void setDataEnabled(boolean enable) {
1855 enforceModifyPermission();
1856 mPhone.setDataEnabled(enable);
1857 }
1308 private void enforceModifyPermission() {
1309 mApp.enforceCallingOrSelfPermission(Android.Manifest.permission.MODIFY_PHONE_STATE, null);
1310 }
À moins que vous n'ayez un téléphone enraciné, je ne pense pas que vous puissiez activer et désactiver les données par programmation, car pour ce faire, nous devons inclure l'autorisation MODIFY_PHONE_STATE, qui n'est accordée qu'aux applications système ou de signature.
La méthode setMobileDataEnabled()
n'est plus appelable via réflexion. Elle était appelable depuis Android 2.1 (API 7) à Android 4.4 (API 19) via réflexion, mais à partir d'Android 5.0 ou version ultérieure, même avec les téléphones enracinés, la méthode setMobileDataEnabled()
n'est pas appelable.
Avance rapide jusqu'à la fin de 2018 ...
La réponse courte est qu’il n’est plus autorisé d’activer/désactiver les données mobiles par programme. Voici la solution que j'utilise tout le temps.
Ce code ouvre l'écran des paramètres d'utilisation des données du système, dans lequel l'utilisateur peut désactiver manuellement les données mobiles.
public void enableDisableMobileData() {
Intent intent = new Intent();
intent.setComponent(new ComponentName("com.Android.settings", "com.Android.settings.Settings$DataUsageSummaryActivity"));
startActivity(intent);
}
Méthode facile.
public void setMobileDataState(boolean mobileDataEnabled)
{
try{
ConnectivityManager dataManager;
dataManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
Method dataMtd = ConnectivityManager.class.getDeclaredMethod("setMobileDataEnabled", boolean.class);
dataMtd.setAccessible(true);
dataMtd.invoke(dataManager, mobileDataEnabled);
}catch(Exception ex){
//Error Code Write Here
}
}