Android - Warum ConnectivityManager.isActiveNetworkMetered immer true zurückgibt (auch bei Wifi)

8

In meiner Musik-Streaming-App für Android hilft der folgende Codepfad, zwischen einem Stream mit hoher Bitrate und einer niedrigeren Bitrate basierend auf Werten zu wählen, die von der ConnectivityManager-Klasseninstanz zurückgegeben werden.

Ich versuche zu verstehen, warum ConnectivityManager.isActiveNetworkMetered () "True" zurückgibt, wenn es offensichtlich ist, dass ich in einem lokalen Wifi-Netzwerk bin. Nimm den folgenden Android / Java-Code:

%Vor%

Wenn ich Wifi ausgeschaltet habe und meine einzige Verbindung mit dem LTE-Netzwerk von AT & amp; T besteht, gibt es Folgendes an die Protokollkonsole aus:

%Vor%

Alles übertrifft die Erwartungen - ich bin in einem mobilen Carrier-Netzwerk, das gemessen wird.

Wechseln Sie jetzt zu meinem Haus Wifi und der gleiche Block des Codes druckt das:

%Vor%

Warum wird isMetered , das Ergebnis von isActiveNetworkMetered , immer noch als true angezeigt? Dies führt dazu, dass der folgende Codepfad den Strom mit niedrigerer Bitrate begünstigt, obwohl ich mich in meinem Heim-WLAN-Netzwerk befinde:

%Vor%

Wie entscheidet isActiveNetworkMetered (), ob das Netzwerk gemessen wird? Ist dieser Teil der WIFI-Verhandlung oder ein bisschen in der SSID-Sendung? Eine Netzwerkeinstellung auf Android? Ich konnte auf meinem Android Kitkat-Gerät keine Einstellungen finden, mit denen ich die Einstellung für ein gemessenes Netzwerk ändern oder ändern kann.

Letzte Woche hat mir mein ISP (Frontier) einen neuen WLAN-Router geschickt. Möglicherweise verwandt? Ich habe auf den Firmware-Seiten des Routers für eine solche Einstellung nichts gesehen.

Ich werde heute später zur Arbeit gehen, um zu sehen, wie es sich in einem anderen Netzwerk verhält. In jedem Fall werde ich wahrscheinlich den obigen Code bearbeiten, um die gemessene Überprüfung zu überspringen, es sei denn, ich kann beweisen, dass es nur eine falsche Einstellung ist.

UPDATE - Das Problem, dass die Netzwerkwiedergabe immer auf meinem HTC One M8 Telefon (mit Kitkat) zurückgelesen wird, aber nicht auf meinem Nexus 7 ab 2012 (auch auf Android 4.4 Kitkat aktualisiert).

>

Problem gelöst - es stellt sich heraus, dass mein Wifi von meinem Handy als "mobiler Hotspot" markiert wurde. Weitere Informationen zum Suchen und Umschalten dieser Flagge finden Sie hier .

    
selbie 26.05.2014, 20:44
quelle

1 Antwort

14

Ich habe das auch getestet, aber ich beobachte das "erwartete" Ergebnis: falsch für WiFi und wahr für 3G. Dies ist in einem Nexus 4 mit Android 4.4.2.

Seltsamerweise die ConnectivityManagerCompat class in der Support-Bibliothek gibt für WiFi false zurück.

%Vor%

BEARBEITEN - Ich fand es (glaube ich)

NetworkPolicyManagerService scheint die Klasse zu sein, die letztendlich das Ergebnis für diese Methode liefert. Und entsprechend können WiFi-Verbindungen tatsächlich gemessen werden. Es enthält einen BroadcastReceiver, der "für W-LAN-Statusänderungen zulässt, um den gemessenen Hinweis zu erfassen" (Zeile 567). Diese Information wird von NetworkInfo.getMeteredHint() erhalten, die bei näherer Betrachtung diesen interessanten Kommentar enthält:

%Vor%

Dieses Flag wird von DhcpResults.hasMeteredHint()

geladen %Vor%

Es scheint also so zu sein, dass der AP seinen WLAN-Clients tatsächlich mitteilt, dass die zugrunde liegende Internetverbindung mit diesem Flag gemessen wird.

EDIT # 2 Relevante Informationen von Ссылка

  

Wenn ein Android-Handy den Hotspot eines anderen Android-Handys verwendet, ist dies der Fall   weiß, dass es sich um eine "gemessene Verbindung" handelt und deaktiviert daher die   teure Synchronisierungsoptionen (z. B. Foto-Synchronisierung). Woher weiß es das? Das   Android Hotspot sendet DHCP Option 43 (herstellerspezifische Optionen) mit   der Wert ANDROID_METERED. Der Client, wenn er ANDROID_METERED sieht   Irgendwo in der Option 43 Werte, schaltet sich die "teure Daten   Verbindung "Option.

Sieht so aus, als wäre diese Flagge zu "play nice" mit einem Hotspot hinzugefügt worden, der von einem anderen Android-Gerät angeboten wird.

EDIT # 3 Das Commit, das diese Funktion eingeführt hat >:

  

Verbinden Sie den gemessenen DHCP-Hinweis für Wi-Fi-Netzwerke.

     

Wenn DHCP-Lease Herstellerinformationen enthält, die auf das Remote-WLAN hinweisen   Netzwerk ist gemessen, beraten Sie NetworkPolicy. Benutzer können immer noch manuell   ändere das Meter-Flag in den Einstellungen.

Sie können auf diese Einstellung zugreifen, indem Sie:

  

Einstellungen - & gt; Datennutzung - & gt; (Überlaufmenü) - & gt; Mobile Hotspots

    
matiash 27.05.2014, 01:30
quelle

Tags und Links