it-swarm.com.de

Wie können Sie feststellen, ob "Mobile Network Data" aktiviert oder deaktiviert ist (auch wenn Sie über WLAN verbunden sind)?

Ich habe eine App, die ich verwenden möchte, um einen Verbindungsstatusbericht von einer Remote-Abfrage zu erhalten.

Ich möchte wissen, ob WLAN angeschlossen ist und ob der Datenzugriff über das Mobilfunknetz aktiviert ist.

Wenn das WLAN außer Reichweite ist, möchte ich wissen, ob ich mich auf das Mobilfunknetz verlassen kann.

Das Problem ist, dass aktivierte Daten immer als wahr zurückgegeben werden, wenn ich über WLAN verbunden bin, und ich das Mobilfunknetz nur dann ordnungsgemäß abfragen kann, wenn keine WLAN-Verbindung besteht.

alle Antworten, die ich gesehen habe, schlagen eine Abfrage vor, um zu sehen, wie die aktuelle Verbindung ist. Ich möchte jedoch wissen, ob das Mobilfunknetz verfügbar ist, falls ich es brauche, auch wenn ich derzeit per WLAN verbunden bin.

Gibt es überhaupt zu sagen, ob die Daten des Mobilfunknetzes aktiviert sind, ohne abzufragen, ob eine Verbindung besteht?

EDIT

Wenn also eine Verbindung über WLAN besteht, gehe ich zu den Einstellungen und deaktiviere 'Data Enabled' und dann in meiner App Folgendes:

 boolean mob_avail = 
 conMan.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).isAvailable();

mob_avail wird als 'true' zurückgegeben, aber ich habe Mobile Network Data deaktiviert. Daher würde ich erwarten, dass es 'false' ist.

Wenn ich das WLAN ausschalte, besteht (zu Recht) keine Verbindung, da ich die Daten des Mobilfunknetzes deaktiviert habe. 

wie kann ich also überprüfen, ob Daten des Mobilfunknetzes aktiviert sind, wenn ich über WLAN verbunden bin?

UPDATE

Ich habe mir getAllNetworkInfo () angeschaut, wie in den Kommentaren von ss1271 vorgeschlagen

Ich gab die über das Mobilfunknetz zurückgegebenen Informationen unter den folgenden 3 Bedingungen aus

WiFi Off - Mobile Daten ein

WiFi On - Mobile Data aus

WiFi On - Mobile Daten ein 

und erhielt die folgenden Ergebnisse:

Mit WiFi AUS:

handy [HSUPA], Status: CONNECTED/CONNECTED, Grund: unbekannt, extra: Internet, Roaming: false, Failover: false, isAvailable: true, featureId: -1, userDefault: false

Mit WLAN an/Mobil aus

NetworkInfo: Typ: mobile [HSUPA], Status: DISCONNECTED/DISCONNECTED, Grund: connectionDisabled, extra: (keine), Roaming: false, Failover: false, isAvailable: true, featureId: -1, userDefault: falsch

Mit WLAN an/Mobil an

NetworkInfo: Typ: mobile [HSPA], Status: DISCONNECTED/DISCONNECTED, Grund: connectionDisabled, extra: (keine), Roaming: false, Failover: false, isAvailable: true, featureId: -1, userDefault: falsch

Wie Sie sehen, hat isAvailable jedes Mal den Wert true zurückgegeben, und der Status wurde nur als getrennt angezeigt, wenn WLAN betroffen war.

KLARSTELLUNG

Ich bin NICHT und schaue, ob mein Telefon derzeit über ein Mobilfunknetz verbunden ist. I AM versucht festzustellen, ob der Benutzer den Datenzugriff über das Mobilfunknetz aktiviert oder deaktiviert hat. Sie können dies ein- und ausschalten, indem Sie auf Einstellungen -> Drahtlos- und Netzwerkeinstellungen -> Mobilfunknetzeinstellungen -> Daten aktiviert gehen

60
Kevin Bradshaw

Der folgende Code zeigt an, ob "mobile data" aktiviert ist oder nicht, unabhängig davon, ob momentan eine mobile Datenverbindung aktiv ist oder ob WLAN aktiviert/deaktiviert ist oder nicht. Dieser Code funktioniert nur unter Android 2.3 (Gingerbread) und höher. Eigentlich funktioniert dieser Code auch auf früheren Android-Versionen ;-)

    boolean mobileDataEnabled = false; // Assume disabled
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    try {
        Class cmClass = Class.forName(cm.getClass().getName());
        Method method = cmClass.getDeclaredMethod("getMobileDataEnabled");
        method.setAccessible(true); // Make the method callable
        // get the setting for "mobile data"
        mobileDataEnabled = (Boolean)method.invoke(cm);
    } catch (Exception e) {
        // Some problem accessible private API
        // TODO do whatever error handling you want here
    }

Hinweis: Sie benötigen die Berechtigung Android.permission.ACCESS_NETWORK_STATE, um diesen Code verwenden zu können.

108
David Wasser

Ich habe die Antwort von Allesio aktualisiert. Settings.Secures mobile_data int ist seit 4.2.2 in Settings.Global umgezogen.

Versuchen Sie diesen Code, wenn Sie wissen möchten, ob das Mobilfunknetz aktiviert ist, auch wenn WLAN aktiviert und verbunden ist.

Aktualisiert, um zu prüfen, ob die SIM-Karte verfügbar ist. Danke für den Hinweis auf Murat.

boolean mobileYN = false;

TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
if (tm.getSimState() == TelephonyManager.SIM_STATE_READY) {
    if(Android.os.Build.VERSION.SDK_INT >= Android.os.Build.VERSION_CODES.JELLY_BEAN_MR1)
    {
        mobileYN = Settings.Global.getInt(context.getContentResolver(), "mobile_data", 1) == 1;
    }
    else{
        mobileYN = Settings.Secure.getInt(context.getContentResolver(), "mobile_data", 1) == 1;
    }
}
29
sNash

Eine Möglichkeit besteht darin, zu prüfen, ob der Benutzer mobile Daten in den Einstellungen aktiviert hat, die höchstwahrscheinlich verwendet werden, wenn das WLAN ausfällt. Dies funktioniert (getestet) und verwendet keine Spiegelung, obwohl ein verborgener Wert verwendet wird in der API:

boolean mobileDataAllowed = Settings.Secure.getInt(getContentResolver(), "mobile_data", 1) == 1;

Abhängig von der API müssen Sie Settings.Global anstelle von Settings.Secure überprüfen, wie von @ user1444325 angegeben.

Quelle: Android-API-Aufruf zum Ermitteln der Benutzereinstellung "Data Enabled"

21
Alessio

Die Funktion von @ sNash funktioniert hervorragend. Bei einigen Geräten habe ich festgestellt, dass sie auch dann als wahr zurückgegeben wird, wenn die Daten deaktiviert sind ... Daher habe ich eine alternative Lösung gefunden, die sich in der Android-API befindet.

getDataState () Methode von TelephonyManager wird sehr nützlich sein.

Ich habe die Funktion von @ snash mit der oben genannten Funktion aktualisiert. Die folgende Funktion gibt "false" zurück, wenn die Mobilfunkdaten deaktiviert sind, andernfalls "true".

private boolean checkMobileDataIsEnabled(Context context){
        boolean mobileYN = false;

        TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
        if (tm.getSimState() == TelephonyManager.SIM_STATE_READY) {
            TelephonyManager tel = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
//          if(Android.os.Build.VERSION.SDK_INT >= Android.os.Build.VERSION_CODES.JELLY_BEAN_MR1)
//          {
//              mobileYN = Settings.Global.getInt(context.getContentResolver(), "mobile_data", 0) == 1;
//          }
//          else{
//              mobileYN = Settings.Secure.getInt(context.getContentResolver(), "mobile_data", 0) == 1;
//          }
            int dataState = tel.getDataState();
            Log.v(TAG,"tel.getDataState() : "+ dataState);
            if(dataState != TelephonyManager.DATA_DISCONNECTED){
                mobileYN = true;
            }

        }

        return mobileYN;
    }
3
MohK

Sie können so etwas versuchen:

ConnectivityManager conMan = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);

//mobile
State mobile = conMan.getNetworkInfo(0).getState();

//wifi
State wifi = conMan.getNetworkInfo(1).getState();


if (mobile == NetworkInfo.State.CONNECTED || mobile == NetworkInfo.State.CONNECTING) 
{
    //mobile
}
else if (wifi == NetworkInfo.State.CONNECTED || wifi == NetworkInfo.State.CONNECTING) 
{
    //wifi
}

Wenn Sie interessiert sind, wenn Sie wirklich verbunden sind, verwenden Sie

NetworkInfo.State.CONNECTED 

nur statt 

NetworkInfo.State.CONNECTED || NetworkInfo.State.CONNECTING
2
Miloš

Ich denke die Verwendung der NetworkInfo-Klasse und isConnected sollte funktionieren:

ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);

return info != NULL || info.isConnected();

Und um zu prüfen, ob mobile Daten vielleicht angeschlossen sind. Ich kann nicht sicher sein, bis ich es teste. Was ich erst morgen tun kann.

TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);

if(tm .getDataState() == tm .DATA_CONNECTED)
   return true;
0
tozka
To identify which SIM or slot is making data connection active in mobile, we need to register action Android:name="Android.net.conn.CONNECTIVITY_CHANGE"  with permission   
uses-permission Android:name="Android.permission.CONNECTIVITY_INTERNAL" &    uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE"

    public void onReceive(Context context, Intent intent) 
 if (Android.net.conn.CONNECTIVITY_CHANGE.equalsIgnoreCase(intent
                .getAction())) {

IBinder b = ServiceManager.getService(Context.CONNECTIVITY_SERVICE);
 IConnectivityManager service =  IConnectivityManager.Stub.asInterface(b);
NetworkState[] states = service.getAllNetworkState();

 for (NetworkState state : states) {

                if (state.networkInfo.getType() == ConnectivityManager.TYPE_MOBILE
                        && state.networkInfo.isConnected()) {

 TelephonyManager mTelephonyManager = (TelephonyManager) context
                        .getSystemService(Context.TELEPHONY_SERVICE);
         int slotList =  { 0, 1 };
          int[] subId = SubscriptionManager.getSubId(slotList[0]);
          if(mTelephonyManager.getDataEnabled(subId[0])) {
             // this means data connection is active for SIM1 similary you 
             //can chekc for SIM2 by slotList[1]
               .................
          }
}

}
0
amit

Sie müssen den ConnectivityManager verwenden, und die NetworkInfo-Details finden Sie hier .

0
CAM-Dev

Hier ist eine einfache Lösung aus zwei anderen Antworten:

        TelephonyManager tm = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            return tm.isDataEnabled();

        } else {
            return tm.getSimState() == TelephonyManager.SIM_STATE_READY && tm.getDataState() != TelephonyManager.DATA_DISCONNECTED;
        }
0
Brian Hong
private boolean haveMobileNetworkConnection() {
        boolean haveConnectedMobile = false;

        ConnectivityManager cm = (ConnectivityManager) getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo[] netInfo = cm.getAllNetworkInfo();

        for (NetworkInfo ni : netInfo) {

            if (ni.getTypeName().equalsIgnoreCase("MOBILE"))
                if (ni.isConnected())
                    haveConnectedMobile = true;
        }
        return haveConnectedMobile;
    }

Hinweis: Sie benötigen die Berechtigung Android.permission.ACCESS_NETWORK_STATE, um diesen Code verwenden zu können

0

verwenden Sie den TelephonyManager

TelephonyManager tm = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);

tm.isDataEnabled()

Laut Android-Dokumentation

https://developer.Android.com/reference/Android/telephony/TelephonyManager.html#isDataEnabled ()

0
Ralph Chen
    ConnectivityManager cm = (ConnectivityManager) activity
                        .getSystemService(Context.CONNECTIVITY_SERVICE);
                NetworkInfo info = cm.getActiveNetworkInfo();
                String networkType = "";
    if (info.getType() == ConnectivityManager.TYPE_WIFI) {
                    networkType = "WIFI";
                } 
else if (info.getType() == ConnectivityManager.TYPE_MOBILE) {

                    networkType = "mobile";
    }
0
Srishti Roy

Laut Android-Dokumentation https://developer.Android.com/training/monitoring-device-state/connectivity-monitoring#Java

ConnectivityManager cm =
     (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);

NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
boolean isConnected = activeNetwork != null &&
                      activeNetwork.isConnectedOrConnecting();
0
Rémy

Hier ist eine Xamarin-Lösung für dieses Problem:

    public static bool IsMobileDataEnabled()
    {
        bool result = false;

        try
        {
            Context context = //get your context here or pass it as a param

            if (Build.VERSION.SdkInt >= BuildVersionCodes.JellyBeanMr1)
            {
                //Settings comes from the namespace Android.Provider
                result = Settings.Global.GetInt(context.ContentResolver, "mobile_data", 1) == 1;
            }
            else
            {
                result = Settings.Secure.GetInt(context.ContentResolver, "mobile_data", 1) == 1;
            }
        }
        catch (Exception ex)
        {
            //handle exception
        }

        return result;
    }

PS: Stellen Sie sicher, dass Sie alle Berechtigungen für diesen Code haben.

0
SubqueryCrunch

Nun, es gibt eine Problemumgehung, um zu überprüfen, ob die Datenverbindung besteht. Ich bin mir aber nicht sicher, ob es auf jedem Gerät funktioniert. Sie müssen das überprüfen. (Es funktionierte auf Android einem Gerät)

long data = TrafficStats.getMobileRxBytes();
if(data > 0){
    //Data is On
}
else{
    //Data is Off
}

Wenn Ihnen diese Methode nicht bekannt ist, gibt sie die Gesamtzahl der Bytes zurück, die seit dem Hochfahren des Geräts über das Mobilfunknetz empfangen wurden. Wenn Sie die mobile Datenverbindung deaktivieren, wird Null (0) zurückgegeben. Beim Einschalten wird wieder die Gesamtzahl der Bytes zurückgegeben. Sie müssen sich jedoch bewusst sein, dass bei Verwendung dieser Problemumgehung ein Problem auftreten kann.

  • Diese Methode gibt auch 0 zurück, wenn Sie das Telefon neu starten, da die Berechnung bei 0 Byte beginnt.