Windows Phone 7

Windows Phone Map control and ZoomLevel limits

ZoomLevel
The Oscars are over, I was playing with my application Earthquakes for Windows Phone and I noticed a bug in the map control. The problem is very simple, but I’d like to share it here with you Windows Phone developers so you don’t make the same mistake.
Like a lot of application that use the Map control, I have two buttons in the ApplicationBar that allow me to zoom in and zoom out.

ZoomLevelActions

So, when you use the Map control for Windows Phone 7 or Windows Phone 8, you can use the property ZoomLevel to zoom in or zoom out. On the click of the button I was simply increasing or decreasing the value without doing any control. I know that’s bad… Apparently, there is a limit for the zoom level that can be apply to the Map. Which is 1 to 19 for Windows Phone 7 and 1 to 20 for Windows Phone 8.

For Windows Phone 7 you can use the following code to change the ZoomLevel property:

private void BtZoomMore(object sender, EventArgs e)
{
   map.ZoomLevel = Math.Min(map.ZoomLevel + 1, 19);
}

private void BtZoomLess(object sender, EventArgs e)
{
   map.ZoomLevel = Math.Max(map.ZoomLevel - 1, 1);
}

And for Windows Phone 8:

private void BtZoomMore(object sender, EventArgs e)
{
   Map.ZoomLevel = Math.Min(Map.ZoomLevel + 1, 20);
}

private void BtZoomLess(object sender, EventArgs e)
{
   Map.ZoomLevel = Math.Max(Map.ZoomLevel - 1, 1);
}

How to detect a 256 MB Windows Phone 7 device

Windows Phone logo

Last Wednesday I talked about a very good article from Nokia on the Best practices for developing on Windows Phone 7 Tango (256 MB devices). Today I’m going to show you how to detect if your application runs on a 512 MB device or 256 MB. Because you probably can’t have the same features in your applications for a “classic” device than on a “low-cost” one, you must be able (without coding a specific version of your application) to detect the capabilities of the current device and adjust the features accordingly.

So here is the code you have to implement at the start of your application. You can store the result (the variable IsLowMemoryDevice) into the application settings in order to avoid to call this method every time.

private void DetectMemoryDevice()
{
    try
    {
        // Gets the application working set limit. (if available)
        long memorySize = (long)DeviceExtendedProperties.GetValue("ApplicationWorkingSetLimit");

        // If the application has more than 90 MB
        // it indicates a 512-MB device.
        IsLowMemoryDevice = memorySize < 94371840L; // == 90 MB
    }
    catch (ArgumentOutOfRangeException)
    {
        // Windows Phone OS update (7.1.1)
        // is not installed, which indicates a 512-MB device. 
        IsLowMemoryDevice = false;
    }
}

Then you can use the variable IsLowMemoryDevice to activate or deactivate the features in your application.

Windows Phone SDK 7.1.1 now available

Windows Phone logo

Microsoft has published this morning the final version of the Windows Phone SDK 7.1.1. You can now download it, create your applications and publish them on the Marketplace. There are two major improvements in this update. First, you can now create and test your applications for the new 256 MB devices. The Windows 8 early adopters will be pleased to see that the emulator provided by this SDK now supports Windows 8!    Another good news is that you don’t need to uninstall the previous version, you can simply install the new version on the top of the previous one.

Download the Windows Phone SDK 7.1.1.

Some links:

Update of Bugsense SDK for Windows Phone 7

BugSenseThe team BugSense updated few weeks ago the SDK for their platform for Windows Phone 7. If you never try it I suggest you to read this post Mobile bug tracking with BugSense. If you already use it in your mobile application, update the SDK is very easy and requires less than 5 seconds. Right click on your solution, then:

image_9

Check your updates!

image_10

You’ll have then only one change to do, the following method is now deprecated:

BugSenseHandler.HandleError(e.ExceptionObject);

You must change it by:

BugSenseHandler.Instance.LogError(e.ExceptionObject);

Best practices for Windows Phone Tango with 256 MB

Windows Phone logoMicrosoft is about to release Windows Phone Tango (March 21st in China), the “light” edition of the mobile OS for low-cost devices. This OS update will support devices with only 256 MB, but in order to do that, we (developers) will have to work a bit more on the performance of our applications. Only 90 MB will be available for the application that is currently running, but Microsoft suggests to use less than 60 MB because the gap between 60 MB and 90 MB will be paged so for better performance, so, stay below 60 MB. The other thing you should know is that the Background agents are not supported on 256-MB devices.

Some Windows Phone developers already received this email from Microsoft to warn them that their applications are too heavy to run on the “low-cost” devices.

image_8

Nokia published an excellent best practices document that provides a very good opportunity for you to improve the performance of your applications.

Best practice tips for delivering apps to Windows Phone with 256 MB by Nokia.

You can of course forbid your application to be run on a Tango device by adding this line in the WPAppManifest.xml file:

<Requirements>
  <Requirement Name="ID_REQ_MEMORY_90" />
</Requirements>

Skype beta is available on Windows Phone

Today, Monday February 27th, is the first day of the Mobile World Congress (MWC) in Barcelona, Spain. Every mobile constructors, integrators, software developer company are presenting their new products. Nokia announced few new Windows Phone, the Lumia 610 and the Lumia 900.

 

Microsoft presented the official application Skype beta for Windows Phone 7! The final release is planned for April of this year.

 Skype-5 Skype-4 Skype-3 Skype-2 Skype-1

 

 

Windows Phone SDK 7.1.1 Update CTP

Windows Phone logo

Microsoft has published yesterday an update for the Windows Phone SDK. This package contains an update for the current emulator, and a new one for the future Tango version of Windows Phone. Just a reminder, the Tango update will permit to have devices with less memory and features to get a very low cost than the high-end phones. So this emulator will allow you to test your applications for the 256MB Windows Phone devices.

This version does not contain the GO LIVE license, so it is forbidden to publish applications using this SDK!

Download the Windows Phone SDK 7.1.1 Update CTP.

Take a screenshot of a FrameworkElement on Windows Phone 7

Windows Phone logoIn my application Earthquakes, if you try it (and I’m sure you already did 🙂 ) you probably noticed that you can take a screenshot of the application and send it by email, by text… Anyway, it is not very tricky to take a screenshot on the current page in Windows Phone 7. Here is the code.

String tempJpeg = "TempJPEG.jpg";

try {
    // Capture the screen (this) and apply no transformation<>  WriteableBitmap bmp = new WriteableBitmap(this, null);

    // Get a virtual store file to temporarily store the image var store = IsolatedStorageFile.GetUserStoreForApplication();
    if (store.FileExists(tempJpeg))
        store.DeleteFile(tempJpeg);

    // Create the file in the store     IsolatedStorageFileStream myFileStream = myStore.CreateFile(tempJpeg);

    // Save the WriteableBitmap into JPEG stream and place into isolated storage file. bmp.SaveJpeg(myFileStream, bmp.PixelWidth, bmp.PixelHeight, 0, 100);
    myFileStream.Close();

    // Create a new file stream. myFileStream = myStore.OpenFile(tempJpeg, FileMode.Open, FileAccess.Read);

    // Put the JPEG file to the photos library on the device. using (MediaLibrary library = new MediaLibrary())
    {
        library.SavePicture("image.jpg", myFileStream);
    }
    myFileStream.Close();
}
catch (Exception) { }

If you want to save only a FrameworkElement instead of the whole page, you can just change this in the first line and use the object you want.

However, a user of the application (thanks to him) noticed a big issue with in my application. If you use the light theme and try to take a screenshot to share, the screenshot appears to be black with only the Bing map. All the text disappears. The problem is that the background of the PhoneApplicationPage is not used in the render of the bitmap, Black is used instead. So in order to fix this problem, you have to define the background on your main container, in the example below I define the Background on the Grid and use the resource PhoneBackgroundBrush.

<phone:PhoneApplicationPage xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                            xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
                            xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
                            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
                            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
                            x:Class="Demo.Screenshot"
                            SupportedOrientations="Portrait"
                            Orientation="Portrait"
                            mc:Ignorable="d"
                            d:DesignHeight="696"
                            d:DesignWidth="480"
                            shell:SystemTray.IsVisible="True">

    <!-- You must define here the background with the resource PhoneBackgroundBrush instead of Transparent -->
    <Grid Background="{StaticResource PhoneBackgroundBrush}">

    </Grid>

</phone:PhoneApplicationPage>

And after that, it works very well!

Wp7EarthquakeLight Wp7EarthquakeDark

Now, please try Earthquakes for Windows Phone 7, it’s free!

 

Windows Phone 7 Applications Requests

Windows Phone logo

Around me, a lot of people complain about Windows Phone 7 and its lack of applications if you compare to the iPhone AppStore or the Android Market. In order to help to change that, the Microsoft MVP Scott Dorman has created a forum on UserVoice to list all applications that will be great to have on the Microsoft Market Place. There are 60,000 applications available today for the Windows Phone 7, it’s nothing compare to the 725,000 available on the Apple AppStore (source Wikipedia), and the 400,000 on the Android Market (source Wikipedia). This website will help companies to see the need of an application for the Microsoft mobile OS, but also for the developers without idea (like I am…).

I suggest that you have a look at the Marketplace Requests website today.

image_7

Codeplex OAuth providers for .NET Framework 4.0 and Windows Phone 7

File:Oauth logo.svg

The project

I started few weeks ago, a new project that allows me to do trading using the APIs provided by E*Trade. The authorization system used is OAuth. My first idea was to create a Windows Phone 7 application for E*Trade, what I started to do. Did you already try to debug web services that you don’t control? Especially when the documentation is not very good. When you send a bad request to the server, you always get the same answer:  The remote server returned an error: NotFound. But what does it mean? Basically everything. That’s why I created a new WPF project to have the full .NET Framework in order to get more information and help me to debug the Web service calls.

What libraries I use

I’m using the Reactive Extensions (Rx) to “wrap” my asynchronous event into observable objects. Then, because E*Trade APIs are based on OAuth protocol for the authorization of the users, I needed an library that helps me to send queries to the server. I’m using the project ReactiveOAuth because it is one of the best I found. I just had to use the source code and modify it, because it was originally created for Twitter, and it seems that every single OAuth provider does not respect the standards.

What’s next

I decided to publish the full source code of my project via CodePlex under the name OAuth Providers. I currently published an updated version of ReactiveOAuth and a basic SDK for E*Trade. I also included an example using WPF that connect to E*Trade and download some stocks information. I’ll publish soon an update of the SDK that will contain more API support.

My next objective is to publish more and more SDK for OAuth providers like Twitter, Facebook, LinkedIn, Foursquare…

Download the SDK