Dieser Artikel ist Tag #2 der Serie 31 Tage Mango von Jeff Blankenburg.
Der Originalartikel befindet sich hier: Day #2: DeviceStatus.
Heute geht es um die DeviceStatus Klasse und die Informationen, die wir mit Hilfe dieser Klasse über das Benutzergerät herausfinden können.
Die in diesem Artikel beschriebene Anwendung ist im Windows Phone Marketplace verfügbar.
Was können wir über den Benutzer erfahren?
Diese Frage bekomme ich recht oft gestellt und üblicherweise antworte ich mit „sehr wenig“. Sie werden nie Zugriff auf die Telefonnummer, Email Adresse oder auf die Identität des Benutzers bekommen, außer der Benutzer stellt Ihnen diese Informationen bereitwillig zur Verfügung. Was wir erfahren können, ist aber trotzdem nützliche Information und sei es nur, um die Benutzbarkeit der Anwendung zu verbessern. Hier ist eine Liste der Daten, die die DeviceInfo Klasse kennt:
- Gerätehersteller
- Gerätename
- Firmware Version
- Hardware Version
- Größe des Hauptspeichers
- Zur Zeit belegter Hauptspeicher
- Grenze der Hauptspeicherauslastung
- Spitze der Hauptspeicherauslastung
- Verfügbarkeit einer physischen Tastatur
- Status der physischen Tastatur
- Aktuelle Stromquelle
Wir können zudem Events setzen, die uns bei Änderung des Status‘ der Tastatur oder der Stromquelle benachrichtigen. Betrachten wir jeden der Datenpunkte und wie wir sie verwenden können. Um auf eine der Eigenschaften zugreifen zu können, müssen Sie oben in der Page ein using Statement hinzufügen:
using Microsoft.Phone.Info;
Keine der Eigenschaften wird Ihnen ermöglichen, ein Gerät eindeutig zu identifizieren. Sie erlauben es aber, Hersteller, Modell, Softwareversion usw. zu bestimmen. Dies kann nützlich sein, wenn Sie beispielsweise für eine bestimmte Hardware optimieren möchten. In der Beispielanwendung für diesen Artikel schreiben wir alle Werte in einen TextBlock mit einem entsprechenden Namen. Wir werden also die leeren Stellen im folgenden Screenshot mit Leben füllen:
Device Manufacturer (string)
Wie zu erwarten, liefert diese Eigenschaft den Namen des Geräteherstellers. Im Emulator wird diese Eigenschaft „Microsoft“ anzeigen. Um den Wert der Eigenschaft im TextBlock anzuzeigen können Sie folgende Zeile verwenden:
DeviceManufacturer.Text = DeviceStatus.DeviceManufacturer;
Device Name (string)
Dies ist ein spezifischer Name für das Gerät — allerdings nicht immer der, den Sie erwarten würden. Ich besitze beispielsweise ein HTC Arrive im Netz von Sprint. Wenn ich jedoch die Anwendung auf meinem Telefon ausführe, wird als DeviceName T7575 gemeldet. Das ist der Name, den HTC für dieses spezielle Gerät verwendet. Um den Gerätenamen von der DeviceStatus Klasse abzufragen können Sie folgenden Code verwenden:
DeviceName.Text = DeviceStatus.DeviceName;
Diese Information kann auch interessant sein, wenn Sie mitbekommen wollen, wann die Hersteller ihre neuen Geräte testen. Indem Sie die Namen der verschiedenen Geräte nach Hause funken, werden Sie der erste sein, der über ein kurz vor der Markteinführung stehendes Gerät Bescheid weiß (Anm. leitning: nunja).
Firmware Version (string)
Die Version der Firmware ist möglicherweise nicht übermäßig interessant, da es extrem viele verschiedene Firmwareversionen für die verschiedenen Geräte gibt. Die Version der Firmware kann jedoch Aufschluss darüber geben, ob ein Windows Phone Update bereits eingespielt wurde oder nicht. Die Firmwareversion meines HTC Arrive ist beispielsweise 2305.13.40301.651. Diese Version steht für das Mango Release. Um auf diese Daten zuzugreifen, verwenden Sie die folgende Snytax:
FirmwareVersion.Text = DeviceStatus.DeviceFirmwareVersion;
Hardware Version (string)
Wie viele Samsung Focus Benutzer erfahren haben, kann die Hardwareversion einen großen Unterschied machen zwischen ansonsten gleichen Geräten. Sollten Sie nicht davon gehört haben: Es gibt Focus Geräte in der Version 1.3 und in der Version 1.4. Anscheinend haben die 1.3 Focus Telefone größere Schwierigkeiten, Updates zu bekommen, obwohl es sich an sich um die gleichen Telefone handelt. Um festzustellen, welche Hardwareversion Ihr Benutzer verwendet, schreiben Sie den folgenden Code:
HardwareVersion.Text = DeviceStatus.DeviceHardwareVersion;
Device Total Memory (long)
Dies ist der physikalisch im Gerät verfügbare Hauptspeicher. Dieser Wert wird nicht übereinstimmen mit dem Wert, der auf der Verpackung des Geräts steht. Statt dessen liefert dieser Wert den verfügbaren Hauptspeicher für das Gerät nachdem sich das Betriebssystem seine 166 MB Hauptspeicher genommen hat und eventuell noch etwas RAM für die im Hintergrund laufenden Anwendungen. Um diese Zahl zu bestimmen, verwenden Sie die folgende Syntax:
DeviceTotalMemory.Text = DeviceStatus.DeviceTotalMemory.ToString();
Application Current Memory Usage (long)
Bei Anwendungen, die einen signifikanten Hauptspeicherverbrauch haben, ist es wichtig, den aktuell verwendeten Speicher im Blick zu haben. Die Grenze liegt bei 90MB — es ist also wichtig, sicherzustellen, dass diese Grenze nicht überschritten wird. Um den aktuellen Hauptspeicherverbrauch der Anwendung festzustellen, schreiben Sie:
ApplicationCurrentMemoryUsage.Text = DeviceStatus.ApplicationCurrentMemoryUsage.ToString();
Application Memory Usage Limit (long)
Wenn Sie eine Hauptspeicherhungrige Anwendung entwickeln, ist es wichtig, diese Zahl im Auge zu behalten. ApplicationMemoryUsageLimit ist das Maximum an zusätzlichem Hauptspeicher, den ihr derzeitiger Anwendungsprozess verwenden kann. Dieser Wert wird zurückgegeben als die Anzahl an verfügbaren Bytes:
ApplicationMemoryUsageLimit.Text = DeviceStatus.ApplicationMemoryUsageLimit.ToString();
Application Peak Memory Usage (long)
Eine weitere Eigenschaft im Zusammenhang mit Speichermanagement ist die Eigenschaft, die es Ihnen erlaubt, die Verbrauchsspitze festzustellen. Wenn Sie die beiden vorangegangenen Eigenschaften beobachtet haben, wissen Sie diesen Wert vielleicht bereits schon. Der Wert ist dennoch eine wertvolle Information wenn Sie Ihre Anwendung debuggen. Um diesen Wert zu zu bekommen, verwenden Sie den folgenden Code:
ApplicationPeakMemoryUsage.Text = DeviceStatus.ApplicationPeakMemoryUsage.ToString();
Is Keyboard Present (boolean)
Es mag albern erscheinen, diese Eigenschaft zu prüfen. Es gibt jedoch viele Gründe, warum es wichtig sein könnte, ob der Benutzer eine physikalische Tastatur hat oder nicht. Sie könnten die Tastatur beispielsweise als Gamepad verwenden oder als Auswahlbuttons bei einem „Wer wird Millionär“-artigen Spiel. Mit dem Wissen um die zusätzliche Hardware lässt sich diese in vielfältiger Weise nutzen. Um auf diesen Wert zuzugreifen, schreiben Sie:
IsKeyboardPresent.Text = DeviceStatus.IsKeyboardPresent.ToString();
Ich würde gerne erfahren, wie Sie diese Information verwenden würden. Wenn Sie eine Idee für die Verwendung der Tastatur haben, lassen Sie es mich in den Kommentaren wissen (Anm. leitning: Wenn Sie tatsächlich eine Idee haben, sollten Sie diese möglicherweise direkt bei Jeffs Blog posten).
Is Keyboard Deployed (boolean)
„Deployed“ mag ein etwas hochtrabender Begriff sein für eine ausgefahrene Tastatur. Wie auch immer, diese Eigenschaft erlaubt uns festzustellen, ob der Benutzer seine Tastatur ausgefahren hat. Wie schon die Information, ob das Gerät überhaupt eine Tastatur hat, ist diese Information sicher für Spezialfälle interessant. Sollten der Zustand der Hardwaretastatur in Ihrer Anwendung eine Rolle spielen, schreiben Sie:
IsKeyboardDeployed.Text = DeviceStatus.IsKeyboardDeployed.ToString();
Da sich dieser Wert jederzeit ändern kann, können wir ihn mittels eines Event Handlers beobachten. Dazu definieren wir einen Event Handler beim Start der Anwendung, etwa so:
DeviceStatus.KeyboardDeployedChanged += new EventHandler(DeviceStatus_KeyboardDeployedChanged);
In der eigentlichen Methode zur Behandlung des Events fragen wir einfach wieder den Wert der obigen Eigenschaft ab. Der einzige Unterschied ist, dass diese Abfrage auf dem UI Thread ausgeführt werden muss. Um das zu tun eignet sich folgender Code:
void DeviceStatus_KeyboardDeployedChanged(object sender, EventArgs e) { Dispatcher.BeginInvoke(() => { IsKeyboardDeployed.Text = DeviceStatus.IsKeyboardDeployed.ToString() }); }
Power Source (object)
Power Source ist möglicherweise die wertvollste Information in der ganzen Liste. Das Wissen, ob das Telefon gerade ans Ladekabel angeschlossen ist oder ob es auf Akku läuft, ermöglicht Ihnen die Aktivitäten Ihrer Anwendung zu planen. Eine Menge neuer Bilder herunterzuladen wenn das Gerät den Akku verwendet, ist möglicherweise nicht die beste Idee. Umgekehrt könnte es schwierig sein, vom Benutzer zu verlangen, den Accelerometer in einem Spiel zu verwenden, wenn er am Ladekabel hängt. Es gibt viele Gründe, die aktuelle Stromquelle zu wissen und so geht’s:
PowerSource.Text = DeviceStatus.PowerSource.ToString();
Ähnlich wie die Eigenschaft IsKeyboardDeployed kann sich der Wert von PowerSource jederzeit ändern. Erstellen Sie einen Event Handler:
DeviceStatus.PowerSourceChanged += new EventHandler(DeviceStatus_PowerSourceChanged);
Auch die Methode für diesen Event erfordert Thread-Sicherheit. Wir verwenden also wieder die Methode Dispatcher.BeginInvoke um die Benutzeroberfläche zu aktualisieren:
void DeviceStatus_PowerSourceChanged(object sender, EventArgs e) { Dispatcher.BeginInvoke(() => PowerSource.Text = DeviceStatus.PowerSource.ToString()); }
Zusammenfassung
Die Klasse DeviceStatus liefert uns eine Fülle von wertvollen Informationen über das Gerät des Benutzers. Dabei ist die Information gerade noch vage genug, um nicht zu wertvoll zu sein. Jede der Eigenschaften hat ihren eigenen Nutzen und ihre speziellen Anwendungsfälle und unter den richtigen Umständen wird ein Entwickler sehr dankbar sein, dass diese Informationen über das Gerät des Anwenders verfügbar sind.
Als eine kleine Vorschau auf auf die Anwendung, die wir gerade entwickelt haben, ist hier ein Screenshot des Windows Phone Emulators:
Um den Code als lauffähiges Projekt herunterzuladen und auf ihrem eigenen Telefon auszuprobieren, klicken Sie auf das Visual Studio Symbol unten. Jeder Artikel in der Serie wird ein begleitendes Codebeispiel haben. Laden Sie den Code herunter und probieren Sie ihn aus um das behandelte Thema komplett zu durchdringen!
Morgen tauchen wir ein in ein wesentlich anwenderfreundlicheres Thema: Alarme und Erinnerungen. Ich werde Ihnen genau zeigen, wie Sie Erinnerungen setzen können, auch wenn Ihre Anwendung nicht ausgeführt wird. Bis dahin!