2015-03-30 3 views
7

Ich muss mobile Daten programmgesteuert ein-/ausschalten. Der folgende Code funktioniert nicht für 5.x. Kannst du mir bitte helfen. Danke im Voraus.Android L (5.x) "Mobile Daten" programmgesteuert ein-/ausschalten

private void setMobileDataEnabled(Context context, boolean enabled) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException, NoSuchMethodException, InvocationTargetException { 
     final ConnectivityManager conman = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
     final Class conmanClass = Class.forName(conman.getClass().getName()); 
     final Field connectivityManagerField = conmanClass.getDeclaredField("mService"); 
     connectivityManagerField.setAccessible(true); 
     final Object connectivityManager = connectivityManagerField.get(conman); 
     final Class connectivityManagerClass = Class.forName(connectivityManager.getClass().getName()); 
     final Method setMobileDataEnabledMethod = connectivityManagerClass.getDeclaredMethod("setMobileDataEnabled", Boolean.TYPE); 
     setMobileDataEnabledMethod.setAccessible(true); 
     setMobileDataEnabledMethod.invoke(connectivityManager, enabled); } 

03-30 12: 42: 29,466: W/System.err (5966): java.lang.NoSuchMethodException: setMobileDataEnabled [boolean] 03-30 12: 42: 29,466: W/System.err (5966): um java.lang.Class.getMethod (Class.java:664) 03-30 12: 42: 29.466: W/System.err (5966): um java.lang.Class. getDeclaredMethod (Class.java:626)

java.lang.NoSuchMethodException: setMobileDataEnabled [boolean] @ unterhalb der Linie.

letzte Methode setMobileDataEnabledMethod = connectivityManagerClass.getDeclaredMethod ("setMobileDataEnabled" Boolean.TYPE);

+0

die Protokollkatze hier bekannt geben –

+0

@DavidJhons überprüfen Sie bitte aktualisierte Frage. –

+2

mögliches Duplikat von [Die Methode setMobileDataEnabled ist ab Android L nicht mehr aufrufbar] (http://stackoverflow.com/questions/26539445/the-setmobiledataenabled-method-is-no-long-callable-aso-of- android-l-und-später) – PageNotFound

Antwort

4

Es scheint, wie die setMobileDataEnabled Methode existiert nicht mehr in ConnectivityManager und diese Funktionalität wurde verschoben TelephonyManager mit zwei Methoden getDataEnabled und setDataEnabled.

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

Wenn die Ausführung von Code erhalten Sie eine Security besagt, dass weder Anwender noch 10089 aktuellen Prozess android.permission.MODIFY_PHONE_STATE hat.

Eine Erlaubnis MODIFY_PHONE_STATE sollte hinzugefügt werden ich diese bekam von Answer Danke Muzikant

+1

Aber Kushal, nach meinem Verständnis ohne Root können Sie nicht diese Erlaubnis in Ihrer App haben. Habe ich recht ? –

+0

Ja, unsere Anwendung sollte System-App sein. – Kushal

+2

Sie benötigen Root-Zugang dafür. also für User-Apps ist das nicht möglich. Vielen Dank. –

1

In Android 5.xx L die versteckte API setMobileDataEnabled Methode entfernt wird und es nicht mehr verwendet werden kann. Sie können dies in android lolipop Quellcode unter /frameworks/base/core/java/android/net/ConnectivityManager.java überprüfen.

Wenn Sie es noch ausführen bestehen, können Sie Code-Schnipsel von Kushal beantwortet verwenden, aber getDataEnabled ein System api ist, die normalen Benutzeranwendungen kippen Zugang. Es gibt auch eine weitere System-API verfügbar setDataEnabled unter TelephonyManager. (/frameworks/base/telephony/java/android/telephony/TelephonyManager.java)

/** @hide */ 
@SystemApi 
public void setDataEnabled(boolean enable) { 
setDataEnabled(SubscriptionManager.getDefaultDataSubId(), enable); 
} 

Es braucht auch die Erlaubnis "android.permission.MODIFY_PHONE_STATE", die nur auf rooted Geräte funktionieren.

+0

Ich bekomme eine 'Kann Methode nicht beheben getDefaultDataSubId' Fehler – msysmilu

+0

Wie haben Sie die API verwendet? Ich hoffe du weißt wie man auf eine versteckte API zugreift. –

+0

Ich habe gesehen, dass Google kürzlich (nach einer bestimmten Version) den Zugriff auf diese versteckten Methoden nicht mehr möglich gemacht hat. – msysmilu