Windows Phone - Der Lockscreen

Lockscreen Integration

Der Windows Phone Lockscreen bietet dem App-Entwickler neue Möglichkeiten zur Integration seiner App in das Betriebssystem und dadurch auch dem Anwender eine noch höhere Flexibilität welche Informationen er auf seinem Gerät angezeigt bekommen möchte. Das Wort ‚möchte‘ hat hier eine besondere Bedeutung, denn der App-Entwickler kann die Integrationsmöglichkeiten in seiner App nur vorsehen; die letztendliche Auswahl, was angezeigt wird, trifft aber der Anwender. Eine App kann sich auf drei verschiedene Arten in den Lockscreen integrieren. Zum einen als Hintergrundbild-Provider, zum anderen über den Benachrichtigungsbereich, wobei dieser wiederum in zwei Bereiche unterteilt ist.

Es gibt dort den Bereich „Detaillierte Statusanzeige“, der Text anzeigen kann, sowie den Bereich schnelle Statusanzeige, der lediglich aus einem Icon und einem Zähler besteht.

Hintergrundbild-Provider

Die auffälligste Integration ist natürlich die als Hintergrundbild-Provider. Dabei hat die, vom Anwender ausgewählte App volle Kontrolle über das Hintergrundbild des Lockscreens. Beinhaltet Ihre App Bilder oder sonstige schöne Grafiken? Geben Sie dem Anwender doch die Möglichkeit diese als Hintergrundbild zu verwenden. Eine schöne Verwendung dieser Funktion bietet der bereits in Windows Phone integrierte Bing-Dienst. Wie auch auf dem Windows Desktop wird hier das Bing-Bild des Tages heruntergeladen und als Hintergrundbild verwendet. Sie können aber auch Bilder und Text zu einem neuen Bild kombinieren und somit Informationen zu aktuellen Ereignissen wie beispielsweise Sportevents oder Wahlen anzeigen. So könnte man den Medaillenspiegel der Olympischen Spiele oder aber Hochrechnungsergebnisse und Sitzverteilungen für Kommunalwahlen anzeigen. Der Anwender müsste dann sein Gerät nicht einmal entsperren. Natürlich ist darauf zu achten, welche Informationen preisgegeben werden, denn immerhin wird dies vor der Freischaltung durch den Gerätepin angezeigt.

Nachfolgend werden die wichtigsten Schritte beschrieben, um Ihre App als Hintergrundbild-Provider verwenden zu können. Bitte beachten Sie, dass der Zugriff auf diese Funktionalität nur mit Silverlight-basierten Apps, also Windows Phone Apps funktioniert. Für die neuen Windows Phone Store Apps existiert dazu leider keine Schnittstelle.

Der wichtigste Schritt ist zunächst einmal die Registrierung Ihrer App für die LockScreen_Background-Erweiterung. Dazu muss die WMAppManifest.xml um den dementsprechenden <Extensions>-Eintrag erweitert werden.

<Extensions>

      <Extension ExtensionName="LockScreen_Background" ConsumerID="{111DFF24-AA15-4A96-8006-2BFF8122084F}" TaskID="_default" />

</Extensions>

Listing1.1: Der benötigte <Extensions> Eintrag für Lockscreens

Die <Extensions>-Sektion ist übrigens zwingend nach der <Tokens>-Sektion einzufügen. Diese Erweiterung ermöglicht nun zu einem dem Anwender die Auswahl Ihrer App als Hintergrundbild-Provider, zum anderen Ihrer App die Verwendung der benötigen Klassen und Funktionen um das Hintergrundbild zu ändern, aber auch sich selbst als Provider zu registrieren. Dies funktioniert natürlich nur mit Zustimmung des Anwenders, denn dieser hat immer die volle Kontrolle über diese Einstellung. Widmen wir uns also vor Verwendung der APIs den Einstellungen, die dem Anwender für diese Funktionalität zur Verfügung stehen. Die Optionen befinden sich unter Einstellungen -> System -> Sperrbildschirm.

Über die Auswahl Hintergrund kann der Anwender eine Applikation auswählen, die dann für das Hintergrundbild verantwortlich ist.

Sobald eine Applikation ausgewählt ist, versucht das System sofort ein Hintergrundbild über diese Applikation zu setzen. Leider lässt sich dies nicht über das Manifest vorgeben, daher muss ein Hintergrundbild mit dem Namen DefaultLockScreen.jpg im Hauptordner der Applikation bereitliegen.

Hinweis: Bitte achten Sie darauf das Standardbild nicht im Assets-Ordner zu erstellen. Leider muss das Bild wirklich im Hauptordner der Applikation liegen.

Ist kein Standardbild vorhanden, verwendet das System ein beliebiges Bild aus der internen Hintergrundbildsammlung. Wie man in BILD 1 sehen kann, besteht aus der Einstellungsseite heraus die Möglichkeit, die App direkt zu starten, um dort beispielsweise ein Bild auszuwählen. Oftmals wird Ihre App aber nicht direkt so gestartet, dass der Anwender ein Bild oder die Einstellungen dazu auswählen kann, sondern er müsste dazu erst durch die App navigieren. Um dies zu vereinfachen wird die Eigenschaft WallpaperSettings als QueryString an die App übergeben, sodass innerhalb der OnNavigatedTo-Überschreibung darauf reagiert und zur korrekten Stelle innerhalb Ihrer App navigiert werden kann. Der umgekehrte Weg, also das Öffnen der Einstellungen aus Ihrer App heraus, funktioniert dank der neuen Launcher-Klasse im Übrigen auch. Dazu muss lediglich folgende Zeile Code implementiert werden:

await Windows.System.Launcher.LaunchUriAsync(new Uri("ms-settings-lock:"));

Listing1.2: Aufruf der Lockscreen Einstellungen

Wenn Sie nun innerhalb Ihrer App mit dem Lockscreen interagieren wollen, um ein Hintergrundbild festzulegen, müssen Sie als erstes prüfen, ob Ihre App überhaupt vom Anwender als Provider festgelegt wurde. Dazu können Sie die Eigenschaft IsProvidedByCurrentApplication aus der LockScreenManager-Klasse auslesen. Ist diese Eigenschaft wahr, dürfen Sie ein Hintergrundbild festlegen. Wenn die Eigenschaft unwahr ist, ist eine andere App als Provider festgelegt und Sie können das Hintergrundbild nicht ändern. Jedoch bietet die LockScreenManager-Klasse die Methode RequestAccessAsync an, mit deren Hilfe Sie den Anwender um Erlaubnis fragen können.

Sollten Sie mit Ihrer App über die erforderliche Berechtigung verfügen, müssen Sie lediglich über die SetImageUri der LockScreen-Klasse ein Uri zu einem Bild übergeben, damit dieses als Hintergrund verwendet wird. Die LockScreen-Klasse besitzt eine weitere Methode namens GetImageUri, die Ihnen die Uri zum derzeitigen Hintergrundbild angibt. Diese Methode können Sie beispielsweise verwenden, um das aktuelle Hintergrundbild in Ihrer Auswahlliste gesondert darzustellen. Im Gegensatz zu der RequestAccessAsync-Methode der LockScreenManager-Klasse stehen Ihnen die Funktionen der LockScreen-Klasse auch in einem Background Agent zur Verfügung, den Sie zum Beispiel dann verwenden können, wenn Sie den Hintergrund dynamisch verändern möchten anstatt die Auswahl allein dem Anwender zu überlassen. Der benötigte Code könnte also wie folgt aussehen:

async void SetLockScrrenImage(string strImagePath)

{

   //Falls Die App nicht der Provider ist den Anwender um Erlaubnis fragen

   if (!LockScreenManager.IsProvidedByCurrentApplication)

   {

      await LockScreenManager.RequestAccessAsync();

   }

   //Falls Die App der Provider ist das ausgewählte Bild setzen

   if (LockScreenManager.IsProvidedByCurrentApplication)

   {

      if (MessageBox.Show("Wollen Sie das Hintergrundbild ändern?", "Hintergundbild", MessageBoxButton.OKCancel) == MessageBoxResult.OK)

      {

         Uri imageUri = new Uri("ms-appx://" + strImagePath, UriKind.RelativeOrAbsolute);

         LockScreen.SetImageUri(imageUri);

      }

   }

}

Listing1.3: Eine Funktion zum Setzen des Hintergrundbildes

Wichtig: Beim Festlegen des Hintergrundbildes erwartet das System einen neuen Dateinamen. Falls Sie denselben Dateinamen wiederverwenden, wird Windows Phone diese Änderungen ignorieren, selbst wenn sich der Inhalt des Bildes vom vorherigen Aufruf unterscheidet.

Benachrichtigungsbereich

Auch wenn die Integration als Hintergrundbild-Provider nicht kompliziert ist, die nötigen Erweiterungen für den Benachrichtigungsbereich sind noch simpler zu integrieren.   Im Gegensatz zu der existierenden LockScreenManager-Klasse gibt es leider keine Möglichkeit automatisch die Konfiguration für den Benachrichtigungsbereich aus der App heraus durchzuführen, die nötigen Schritte müssen vom Anwender durchgeführt werden.

Um jedoch überhaupt in den beiden Listen aufgeführt zu werden, müssen zuvor Extensions-Einträge in der WMAppManifest.xml erstellt werden.

Um die detaillierte Statusanzeige verwenden zu können wird folgender Eintrag benötigt:

<Extensions>

   <Extension ExtensionName="LockScreen_Notification_TextField" ConsumerID="{111DFF24-AA15-4A96-8006-2BFF8122084F}" TaskID="_default" />

</Extensions>

Listing1.4: Extensions Eintrag zur detaillierten Statusanzeige

Für die schnelle Statusanzeige wird der folgende Eintrag hinzugefügt:

<Extensions>

<Extension ExtensionName="LockScreen_Notification_IconCount" ConsumerID="{111DFF24-AA15-4A96-8006-2BFF8122084F}" TaskID="_default" />
</Extensions>

Listing1.5: Extensions Eintrag zur einfachen Statusanzeige

Da die schnelle Statusanzeige als ein Icon mit einem Zähler anzeigt wird, wird noch das dementsprechende Icon benötigt. Dazu ist ein 30x30 Pixel großes Bild im PNG-Format nötig, welches als Content zu dem Projekt hinzugefügt werden muss. Das Icon kann auch im Assets-Ordner abgelegt werden. Der Inhalt des Bildes darf lediglich aus einem Transparenten Hintergrund und einem vollständig weißen Vordergrund bestehen. Der Name der Datei ist frei wählbar, er wird als URI über das DeviceLockImage URI-Element in der WMAppManifest.xml angegeben. Das geänderte Manifest sieht dann wie folgt aus:

<Tokens>

   <PrimaryToken TokenID="LockScreenNotificationToken" TaskName="_default">

      <TemplateFlip>

         <SmallImageURI IsRelative="true" IsResource="false">Assets\Tiles\FlipCycleTileSmall.png</SmallImageURI>

         <Count>30</Count>

         <BackgroundImageURI IsRelative="true" IsResource="false">Assets\Tiles\FlipCycleTileMedium.png</BackgroundImageURI>

         <Title>LockScreenNotification</Title>

         <BackContent>Test</BackContent>

         <BackBackgroundImageURI></BackBackgroundImageURI>

         <BackTitle></BackTitle>

         <DeviceLockImageURI IsRelative="true" IsResource="false">Assets\LockImage.png</DeviceLockImageURI>

         <HasLarge></HasLarge>

      </TemplateFlip>

   </PrimaryToken>

</Tokens>

Listing1.6: DeviceLockImageURI Element innerhalb des Tile Templates

Achtung: Achten Sie innerhalb der WMAppManifest.xml auf die richtige Reihenfolge der Elemente und vermeiden sie Leerzeichen und Zeilenumbrüche in URIs, da es sonst zu Kompilierungsfehlern oder späteren Laufzeitfehlern kommen kann.

Doch wie werden die Informationen nun aktualisiert? Ein spezielles API in der LockScreen-Klasse existiert dazu nicht, aber vermutlich verwenden Sie die benötigte Schnittstelle in Ihrer App bereits, denn es werden zwei Eigenschaften des primären Live Tiles Ihrer App für die Anzeige ausgewertet. Das wäre zu einem das Count-Element und zum andern das BackContent-Element. Wenn Sie also bereits Push Notifications oder Background Agents einsetzen, um Ihr Live Tile zu aktualisieren wird dadurch auch automatisch der LockScreen aktualisiert. Der eigentliche Code zum Setzen der Informationen sieht beispielsweise wie folgt aus:

ShellTile ttf = ShellTile.ActiveTiles.First();

FlipTileData ftd = new FlipTileData

{

   Count = (int)slider.Value,

   BackContent = txtInfo.Text

};

ttf.Update(ftd);

Listing1.7: Aktualisierung des Tiles, und somit der LockScreen Informationen

Mit diesen einfachen und kleinen Änderungen können Sie ihre App tief in das System integrieren und Ihren Anwendern eine weitere Möglichkeit geben, mit Ihrer App zu interagieren beziehungsweise über Ihre App sein System an seine Wünsche anzupassen.

Peter Nowak
  • Peter Nowak

Patrick Getzmann
  • Patrick Getzmann

Mehr zum Thema

Alle Artikel im Überblick