© DrHitch/Shutterstock.com
Windows Phone 8.1

4 Dateiübertragungen, Location Tracking und Neuheiten in WP 8.1


Während es im dritten Kapitel um die Ausführung von periodisch wiederkehrenden oder ressourcenintensiven Aufgaben bzw. um das Abspielen von Audiodaten im Hintergrund ging, soll es in diesem Kapitel um die Übertragung von Dateien und das Aufzeichnen von Positionsdaten im Hintergrund gehen, genauso wie um die mit Windows Phone 8.1 neu eingeführten Background Tasks.

Eine der immer wieder benötigten Funktionalitäten in einer mobilen App ist die Übertragung von Daten bzw. Dateien im Hintergrund. Bereits die Windows-Phone-7.5-Plattform hat hierfür den BackGroundTransferAgent bereitgestellt, einen speziellen Betriebssystemagenten. Er wird mithilfe des BackGroundTransferService und der Klasse BackGroundTransferRequest aus der Vordergrund-App heraus gesteuert.

Dabei können Daten sowohl hoch- als auch heruntergeladen werden. Zunächst ist hierzu ein neuer BackGroundTransferRequest anzulegen. Diese Anforderung enthält unter anderem die Ressource, auf die zugegriffen werden soll, als URL, die Methode (GET oder POST), mit der der Zugriff erfolgen soll und die Datei im IsolatedStorage, in die oder aus der übertragen werden soll.

Hinweis:

Es ist nicht möglich, direkt einen Stream zu übertragen; das funktioniert nur via IsolatedStorage.

var request = 
new BackgroundTransferRequest(fileToDownload) {
Method = "GET",
DownloadLocation = saveToFilename
};

Das Anforderungsobjekt wird anschließend mithilfe des BackGroundTransferService in die Werteschlange eingereiht:

BackgroundTransferService.Add(request);

Es können nicht beliebig viele Hintergrundübertragungen in die Warteschlange eingereiht werden. So lassen sich unter Windows Phone 8 maximal fünf Anforderungen je App einreihen, und auf dem Gerät dürfen es insgesamt nicht mehr als 500 Anforderungen sein, wobei immer maximal zwei Anforderungen gleichzeitig bearbeitet werden können. Wird eines der Limits überschritten, tritt eine Exception beim Einreihen mithilfe des BackgroundTransferService auf. Ferner darf die Größe der Datei, abhängig von den Voreinstellungen des Requests, bei Mobilfunk 20 und bei WLAN 100 Megabyte nicht überschreiten.

Für die Zertifizierung im Store ist zu beachten, dass jeder Transfer durch den Benutzer initiiert werden muss (keine automatischen Transfers, davon ausgenommen sind benutzerimitierte zeitgesteuerte Übertragungen). In jedem Fall ist der Benutzer über jeden stattfindenden Transfer zu informieren, mit der Möglichkeit, diesen ggf. abzubrechen. Der Benutzer sollte darüber hinaus auswählen können, ob UMTS oder WiFi für die Übertragungen verwendet werden soll.

In der Beispielanwendung „03 FileTransfer“ unter [1] werden die zu übertragenden Dateien unter Verwendung der Hilfsfunktion GetDownloadItems aus der XML-Datei data.xml gelesen:

public IEnumerable<DownloadItem> GetDownloadItems(string uri = "data.xml") {
var data = XElement.Load(uri);
return from f in data.Descendants("file")
select new DownloadItem {
Name = f.Attribute("name").Value,
Filename = f.Attribute("filename").Value,
Url = f.Attribute("url").Value
};
}

Nach dem Navigieren auf die Hauptseite MainPage.xaml werden zunächst alle Dateien ausgelesen, die übertragen werden können. Anschließend werden alle aktiven Hintergrundübertragungen ermittelt und mit den zu übertragenen Dateien abgeglichen. Dabei wird der aktuelle Status übernommen und die Event Handler der Vordergrund-App werden mit möglichen aktive Hintergrundübertragungen verbunden, sodass neben dem Status auch der Vorschnitt angezeigt werden kann (Listing 4.1).

protected override void OnNavigatedTo(NavigationEventArgs e) {
EnsureTransfersDirectory();

_items = new ObservableCollection<DownloadItem>(GetDownloadItems());
lsItems.ItemsSource = _items;

// reattach to ongoning transfers
foreach (var request in BackgroundTransferService.Requests) {
var file = Path.GetFileName(request.DownloadLocation.OriginalString);
var item = _items.SingleOrDefault(i => i.Filename == file);
if (item == null) continue;

request.TransferProgressChanged += (sender, args) => UpdateProgress(item, request);
request.TransferStatusChanged += (sender, args) => UpdateTransferStatus(item, request);
UpdateTransferStatus(item, request);
UpdateProgress(item, request);
}
}

Listing 4.1

Der Status der einzelne...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang