The range of Tasks available in the Microsoft.Phone.Tasks namespace call into various system features from your application. In some circumstances these may not work as expected. The most obvious example is the Emulator where not all of the system is implemented. The behaviour will differ depending on the specific task. For example EmailComposeTask on the emulator will display a message that no accounts are setup and of course you cant create these yourself because this functionality is hidden in the emulator. The other situation which can cause tasks to fail is when your device is docked with the Zune software. As a developer there is a tool to get around this when debugging but you must write your software to be aware of this to avoid upsetting users. In Windows Mobile we would have used SystemState.CradlePresent to detect when the device was docked, there isn’t an equivalent property for Windows Phone. Instead you can check the network type. Because we know that the hardware configurations for Windows Phone 7 are quite specific we know that devices will have phone, wifi and USB cable connections. You can detect the network type using the Microsoft.Phone.Net.NetworkInformation.NetworkInterface.NetworkInterfaceType property. There are a lot of possible values in the NetworkInterfaceType enumeration but only a few are relevant:-
Ethernet – Used for Zune cable connection
MobileBroadbandCdma
MobileBroadbandGsm – For phone connections
Wireless80211 – For WiFi
So by checking for the value Ethernet we can tell if the device is currently docked. The only caveat is that this property isn’t set immediately when you dock and there can be a few seconds before the connection is established.
Case Study – PhotoChooserTask
The PhotoChooserTask works on the emulator with a selection of default images. On the phone it will fail if the phone is docked. The Completed event will be raised and a TaskResult of Cancel will be returned – as if the user had cancelled. This simple block of code can be used to wrap your call and handle this situation (for a change a little VB):-
If Not Microsoft.Phone.Net.NetworkInformation.NetworkInterface.NetworkInterfaceType = Microsoft.Phone.Net.NetworkInformation.NetworkInterfaceType.Ethernet Then
Dim pct As New Microsoft.Phone.Tasks.PhotoChooserTask
AddHandler pct.Completed, AddressOf pct_completed
pct.Show()
Else
MessageBox.Show("To view photos, disconnect your phone from the computer", "My Application", MessageBoxButton.OK)
End If
Task behaviours
Task Name | Emulator | Phone (Docked) |
CameraCaptureTask | Yes (simulated data) | No (Completed returns TaskResult.Cancel) |
EmailAddressChooserTask | Yes | Yes |
EmailComposeTask | Shows error message (no account) | Yes |
MarketplaceDetailTask | Exception 80070057 | No |
MarketplaceHubTask | Exception 80070057 | No |
MarketplaceReviewTask | Exception 80070057 | No |
MarketplaceSearchTask | Exception 80070057 | No |
PhoneCallTask | Yes | Yes |
PhoneNumberChooserTask | Yes | Yes |
PhotoChooserTask | Yes (Sample data) | No (Completed returns TaskResult.Cancel) |
SaveEmailAddressTask | Yes | Yes |
SavePhoneNumberTask | Yes | Yes |
SearchTask | Yes | Yes |
SmsComposeTask | Yes | Yes |
WebBrowserTask | Yes | Yes |
The marketplace tasks perform no action and these ones don’t have a Completed event so you don’t get any feedback. You can provide similar logic to the above to warn the user that they can’t use Marketplace functionality when docked, you could also hide any marketplace links from your UI based on the network state.