2015-06-29 6 views
24

Sebbene questo sia un "duplicato", le risposte correnti non sono aggiornate e, soprattutto, non sono più applicabili. Ho pensato che sarebbe stato utile fornire una risorsa aggiornata qui, se possibile, per risparmiare tempo, come ho appena fatto, ricercando questo problema.Ultimo aggiornamento abilitato e disabilitato i dati mobili a livello di programmazione

Ho cercato su google per visualizzare le ultime informazioni sulla possibilità di abilitare e disabilitare i dati mobili da un'app (se il wifi non è disponibile).

Questa è una delle ultime cose che posso trovare:
Did you know you can no longer Disable/Enable Data on lollipop from a widget?

C'è una risposta a questo, cito:

Non c'è mai stata un'API per esso. Gli sviluppatori stavano usando una soluzione alternativa chiamando il metodo tramite Reflections. Tutto ciò che Google ha fatto è stato chiudere questo "exploit".

c'è anche questo dibattito:

Replacement for setMobileDataEnabled() api
Qual è febbraio 2015.

Ci sono queste domande qui:

How to disable Mobile Data on Android

Questo è stato chiesto nel 2010 e la l'ultima risposta è stata aggiornata con un solo rivestimento nel dicembre 2014.

Enable/disable data connection in android programmatically

E questa, la risposta accettata nel 2012.

Quali sono le ultime su questo tema?

Può ancora essere fatto?

+1

http://stackoverflow.com/questions/26539445/the-setmobiledataenabled-method-is-no-longer-callable-as-of-android-l-and-later – CommonsWare

+3

@Heyyou Non sembra possibile più. Nella migliore delle ipotesi, è possibile rilevare se era acceso o meno e quindi chiedere all'utente di accenderlo portandoli alla pagina delle impostazioni – nyx

+1

@nyx Non credo sia possibile senza creare un'app di sistema. –

risposta

8

Io uso una soluzione che funziona solo per radicate cellulari.

Procedimento setMobileDataEnabled stato rimosso dai ConnectivityManager ma due metodi getDataEnabled e setDataEnabled sono stati aggiunti alla TelephonyManager per questa funzionalità.

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

Ma è necessario aggiungere questa autorizzazione (MODIFY_PHONE_STATE) per il file manifesto altrimenti si otterrà un SecurityException.

+0

Ho assegnato i minuti di taglie prima di aver postato questa risposta, mi dispiace, perché li avrei confrontati. –

+0

Sarà possibile accettare la mia risposta? –

14

Non funziona su non-rooted telefono come hanno aggiunto il controllo di autorizzazione MODIFY_PHONE_STATE. Questa autorizzazione è concessa solo alle app di sistema o di firma con riferimento allo here.

Controllare il codice qui sotto da :

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 } 
+0

Link davvero belli, grazie per quello. –

+0

@YvetteColomb so che questo è vecchio, ma è ancora così? Anche l'applicazione di firma significa che se ha un apk firmato funzionerà senza il telefono di rooting? –

+0

@PeterHaddad ci sono state alcune modifiche negli sdk da allora. Non sono sicuro. Lo vedremo. Non posso farlo subito. –

10

A meno che non si disponga di un telefono rootato, non penso che sia possibile abilitare e disabilitare i dati a livello di programmazione, perché per farlo è necessario includere il permesso MODIFY_PHONE_STATE assegnato solo alle app di sistema o di firma.

setMobileDataEnabled() metodo non più richiamabile tramite riflessione. È stato richiamabile da Android 2.1 (API 7) ad Android 4.4 (API 19) tramite riflessione, ma da Android 5.0 e versioni successive, anche con i telefoni rooted, il metodo setMobileDataEnabled() non è richiamabile.

+0

Grazie per la tua risposta e benvenuto per il tuo primo contributo a SO dopo essere stato qui per un po ':) –