Farbe der Netzwerkverbindungen: Unterschied zwischen den Versionen

Umgeschrieben und mit Code-Teilen belegt
(verlinkt)
(Umgeschrieben und mit Code-Teilen belegt)
Zeile 2: Zeile 2:
Die [[Android]]-[[Benachrichtigungszeile]] beinhaltet unter anderem Symbole für aktive Netzwerkverbindungen wie [[WLAN]] oder das Mobile Netzwerk (GPRS/UMTS/[[LTE]] u.Ä.). Immer wieder, so auch in den Foren von Android-Hilfe.de<ref>http://www.android-hilfe.de/android-allgemein/395599-bedeuten-die-farben-bei-dem-netzempfang.html</ref><ref>http://www.android-hilfe.de/motorola-atrix-forum/179474-empfangsbalken-edge-anzeige-mal-blau-mal-weiss.html</ref><ref>http://www.android-hilfe.de/galaxy-nexus-forum/175043-geloest-farbe-der-netzwerkverbindungen.html</ref><ref>http://www.android-hilfe.de/huawei-ascend-y200-forum/258410-empfangsbalken-mal-gruen-mal-weiss.html</ref><ref>http://www.android-hilfe.de/huawei-ideos-x3-u8510-forum/196762-empfangsbalken-weiss-statt-gruen.html</ref>, kommt die Frage auf, warum die Symbole mal grau und mal grün (unter Android {{Android|2}}) bzw. blau (unter Android {{Android|4}}) sind.
Die [[Android]]-[[Benachrichtigungszeile]] beinhaltet unter anderem Symbole für aktive Netzwerkverbindungen wie [[WLAN]] oder das Mobile Netzwerk (GPRS/UMTS/[[LTE]] u.Ä.). Immer wieder, so auch in den Foren von Android-Hilfe.de<ref>http://www.android-hilfe.de/android-allgemein/395599-bedeuten-die-farben-bei-dem-netzempfang.html</ref><ref>http://www.android-hilfe.de/motorola-atrix-forum/179474-empfangsbalken-edge-anzeige-mal-blau-mal-weiss.html</ref><ref>http://www.android-hilfe.de/galaxy-nexus-forum/175043-geloest-farbe-der-netzwerkverbindungen.html</ref><ref>http://www.android-hilfe.de/huawei-ascend-y200-forum/258410-empfangsbalken-mal-gruen-mal-weiss.html</ref><ref>http://www.android-hilfe.de/huawei-ideos-x3-u8510-forum/196762-empfangsbalken-weiss-statt-gruen.html</ref>, kommt die Frage auf, warum die Symbole mal grau und mal grün (unter Android {{Android|2}}) bzw. blau (unter Android {{Android|4}}) sind.


== Farberklärung ==
Das Farbspiel ist selbstverständlich nicht bedeutungslos und hat einen Hintergrund: Ist das Symbol blau (bzw. grün), so besteht eine aktive, unbeschränkte Internetverbindung (unabhängig, ob diese über WLAN oder einem mobilen Netzwerk hergestellt wurde). Ist das Symbol hingegen grau, so besteht zwar eine Verbindung mit einem Netzwerk, allerdings konnte keine Internetverbindung hergestellt werden, oder es wurde eine Einschränkung erkannt (bspw. muss sich der Nutzer für das WLAN-Netz authentifizieren, o.ä.), jedenfalls '''kann''' es Probleme bei der Kommunikation mit dem Internet geben.
Dass dieses Verhalten nicht willkürlich ist, sollte klar sein. Dieses Farbspiel hat in der Tat eine Bedeutung: Sind die Symbole farbig (grün oder blau), bedeutet dies, dass die Hintergrunddatensynchronisation aktiv ist bzw. dass eine Verbindung mit den Google-Servern besteht.


Sind die Symbole farblos (grau), bedeutet dies, dass eines dieser vier Szenarien zutrifft:
== technische Umsetzung ==
* kein Kontakt zum Internet
Die Statusbar ist Teil der SystemUI.apk, welche glücklicherweise Teil des AOSP Projektes ist und der Source Code somit öffentlich zur Verfügung steht.<ref>{{Internetquelle|titel = platform/frameworks/base - Git at Google|url = https://android.googlesource.com/platform/frameworks/base/|zugriff = 2015-11-29|werk = android.googlesource.com}}</ref> Die Farbgebung betrifft hierbei mehrere Symbole, zum Verständnis der Umsetzung ziehen wir hier das Symbol für die WiFi (WLAN) Verbindung heran. Die möglichen Symbole werden dabei in der Klasse WifiIcons definiert:<ref>{{Internetquelle|titel = android/platform_frameworks_base|url = https://github.com/android/platform_frameworks_base/blob/7de7e0b0dd61acba813dec3a07d29f1d62026470/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiIcons.java#L22-L33|zugriff = 2015-11-29|werk = GitHub}}</ref>
* Routing zu den Google-Servern gestört (keine Verbindung zu den Google-Servern)
<syntaxhighlight lang="java">
* Ausfall der Google-Server
static final int[][] WIFI_SIGNAL_STRENGTH = {
* Hintergrundsynchronisation ausgeschaltet
{ R.drawable.stat_sys_wifi_signal_0,
  R.drawable.stat_sys_wifi_signal_1,
  R.drawable.stat_sys_wifi_signal_2,
  R.drawable.stat_sys_wifi_signal_3,
  R.drawable.stat_sys_wifi_signal_4 },
{ R.drawable.stat_sys_wifi_signal_0_fully,
  R.drawable.stat_sys_wifi_signal_1_fully,
  R.drawable.stat_sys_wifi_signal_2_fully,
  R.drawable.stat_sys_wifi_signal_3_fully,
  R.drawable.stat_sys_wifi_signal_4_fully }
};
</syntaxhighlight>
 
Das Array <code>WIFI_SIGNAL_STRENGTH</code> hält dabei zwei weitere Arrays (auch als multidimensionales Array bezeichnet), die die einzelnen Symbole definieren (Array 1 (bzw. 0 bei korrekter Zählweise), ohne '''_fully''' im Namen, sind dabei die "grauen" Symbole, Array 2 (bzw. 1), mit '''_fully''' im Namen, die blauen). Die Icons selbst liegen als [http://developer.android.com/intl/vi/reference/android/graphics/drawable/VectorDrawable.html VectorDrawable] vor,[1] und können am einfachsten mit dem [[Android Studio]] visualisiert werden. Genutzt werden die Icons in der Klasse WifiSignalController, der Updates für die WiFi-Signale verarbeitet:<ref>{{Internetquelle|titel = android/platform_frameworks_base|url = https://github.com/android/platform_frameworks_base/blob/d59921149bb5948ffbcb9a9e832e9ac1538e05a0/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiSignalController.java#L59|zugriff = 2015-11-29|werk = GitHub}}</ref>
<syntaxhighlight lang="java">
mCurrentState.iconGroup = mLastState.iconGroup = new IconGroup(
"Wi-Fi Icons",
WifiIcons.WIFI_SIGNAL_STRENGTH,
WifiIcons.QS_WIFI_SIGNAL_STRENGTH,
AccessibilityContentDescriptions.WIFI_CONNECTION_STRENGTH,
WifiIcons.WIFI_NO_NETWORK,
WifiIcons.QS_WIFI_NO_NETWORK,
WifiIcons.WIFI_NO_NETWORK,
WifiIcons.QS_WIFI_NO_NETWORK,
AccessibilityContentDescriptions.WIFI_NO_CONNECTION
);
</syntaxhighlight>
sowie in der Routine, die die Icon-ID zurückliefert:<ref>{{Internetquelle|titel = android/platform_frameworks_base|url = https://github.com/android/platform_frameworks_base/blob/d59921149bb5948ffbcb9a9e832e9ac1538e05a0/packages/SystemUI/src/com/android/systemui/statusbar/policy/SignalController.java#L135-L143|zugriff = 2015-11-29|werk = GitHub}}</ref>
<syntaxhighlight lang="java" line>
public int getCurrentIconId() {
if (mCurrentState.connected) {
return getIcons().mSbIcons[mCurrentState.inetCondition][mCurrentState.level];
} else if (mCurrentState.enabled) {
return getIcons().mSbDiscState;
} else {
return getIcons().mSbNullState;
}
}
</syntaxhighlight>
Entscheidend ist hier der erste if-Zweig in Zeile 2-4. Falls die aktuelle Verbindung aktiv und mit einem Netzwerk verbunden ist, wird über die Variable <code>mCurrentState.inetCondition</code> entschieden, ob das Array 0 (graue Symbole) oder Array 1 (blaue Symbole) verwendet wird. Die Variable selbst wird in der Update-Routine für die aktuelle Verbindung gesetzt:<ref>{{Internetquelle|titel = android/platform_frameworks_base|url = https://github.com/android/platform_frameworks_base/blob/d59921149bb5948ffbcb9a9e832e9ac1538e05a0/packages/SystemUI/src/com/android/systemui/statusbar/policy/SignalController.java#L79-L82|zugriff = 2015-11-29|werk = GitHub}}</ref>
<syntaxhighlight lang="java">
public void updateConnectivity(BitSet connectedTransports, BitSet validatedTransports) {
mCurrentState.inetCondition = validatedTransports.get(mTransportType) ? 1 : 0;
notifyListenersIfNecessary();
}
</syntaxhighlight>
Die übergebene Variable <code>validatedTarnsports</code> beinhaltet den Status aller aktiven Verbindungen, und wird in der Klasse NetworkControllerImpl über die Update-Routine befüllt:<ref>{{Internetquelle|titel = android/platform_frameworks_base|url = https://github.com/android/platform_frameworks_base/blob/d59921149bb5948ffbcb9a9e832e9ac1538e05a0/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java#L568-L601|zugriff = 2015-11-29|werk = GitHub}}</ref>
<syntaxhighlight lang="java" line>
private void updateConnectivity() {
mConnectedTransports.clear();
mValidatedTransports.clear();
for (NetworkCapabilities nc :
mConnectivityManager.getDefaultNetworkCapabilitiesForUser(mCurrentUserId)) {
for (int transportType : nc.getTransportTypes()) {
mConnectedTransports.set(transportType);
if (nc.hasCapability(NET_CAPABILITY_VALIDATED)) {
mValidatedTransports.set(transportType);
}
}
}
 
if (CHATTY) {
Log.d(TAG, "updateConnectivity: mConnectedTransports=" + mConnectedTransports);
Log.d(TAG, "updateConnectivity: mValidatedTransports=" + mValidatedTransports);
}
 
mInetCondition = !mValidatedTransports.isEmpty();
 
pushConnectivityToSignals();
}
 
/**
* Pushes the current connectivity state to all SignalControllers.
*/
private void pushConnectivityToSignals() {
// We want to update all the icons, all at once, for any condition change
for (MobileSignalController mobileSignalController : mMobileSignalControllers.values()) {
mobileSignalController.updateConnectivity(mConnectedTransports, mValidatedTransports);
}
mWifiSignalController.updateConnectivity(mConnectedTransports, mValidatedTransports);
mEthernetSignalController.updateConnectivity(mConnectedTransports, mValidatedTransports);
}
</syntaxhighlight>
Eine Verbindung wird dann '''blau''' markiert, wenn sie den Status <code>NET_CAPABILITY_VALIDATED</code> hat (siehe Code-Zeile 8-10), welcher im Code wie folgt beschrieben wird:<ref>{{Internetquelle|titel = android/platform_frameworks_base|url = https://github.com/android/platform_frameworks_base/blob/d89b76a58dcffa7dbc5974d14c7914f44233bef3/core/java/android/net/NetworkCapabilities.java#L177|zugriff = 2015-11-29|werk = GitHub}}</ref>
 
Indicates that connectivity on this network was successfully validated. For example, for a
network with NET_CAPABILITY_INTERNET, it means that Internet connectivity was successfully
detected.


== Siehe auch ==
== Siehe auch ==
11.008

Bearbeitungen