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
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.
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;
}
}
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"
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;
}
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
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;
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]
.................
}
}
}
Sie müssen den ConnectivityManager verwenden, und die NetworkInfo-Details finden Sie hier .
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;
}
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
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 ()
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";
}
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();
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.
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.