Sample Windows 8.1 App – Uploading Images to Cloud Using Azure Mobile Services
I ran into several issues while trying to put together a quick demo universal Windows App using Microsoft Azure Mobile Services and the Azure Storage Client Library. I fixed the issues after a few hours of debugging and testing, and now have a working app.
You can download the demo code here, replace mobile services and storage accounts with yours, and compile the code in Visual Studio 2013 Update 4.
- Change NotificationHub and Mobile Services code in the app.xaml.cs file in the Shared project
- Change NotificationHub client code in the program.cs file in the Console1Application project
- Change database connection and STORAGE_ACCOUNT_ACCESS_KEY in the web.config file in the Service project
The Starting Point
I started with creating an Azure Mobile Services and download the universal Windows app. The code just worked. I then added Notification Hub function to the Windows Store app (Windows 8.1) and created a console app for testing the notification hub function. That all worked. See more info with “Get Started with Notification Hubs”.
The Upload Images to Azure Storage App
You can follow detailed instructions here to create a Windows Store or Windows Phone app that utilizes Azure Storage Client Library. If you want to see how to capture images using a computer camera, you can download a great demo here. The problem is that instructions were created for a Windows Store or Windows Phone app, not for a Universal Windows App, This is where I ran into the issues, which I will discuss below.
Issue #1: AppBarButton
Tim Heuer wrote a great post on Using AppBarButton in Windows 8.1 and explained the removal of StandardStyles.xaml from your Windows 8.1 projects. Basically, change the xaml code as follows in the mainpage.xaml file.
<StackPanel Orientation="Horizontal" Margin="72,0,0,0">
<TextBox Name="TextInput" Margin="5" MaxHeight="40" MinWidth="300"></TextBox>
<AppBarButton Name="btnTakePhoto" Icon="Camera" Click="OnTakePhotoClick" />
<AppBarButton Name="ButtonSave" Icon="Upload" Click="ButtonSave_Click"/>
</StackPanel>
Issue #2: The ToDoItem Class
Add the new properties in two places, one in ToDoItem.cs in the service project, and one in the ToDoItem.cs file in the Shared project. Notice that the latter has property attribute defined.
Issue #3: CameraCaptureUI not available in the Universal Windows App
Use MediaCapture instead. See modified code below.
// Use a StorageFile to hold the captured image for upload.
StorageFile media = null;
MediaCapture cameraCapture;
public MainPage()
{
this.InitializeComponent();
this.InitializeCamera();
}
private async void InitializeCamera()
{
cameraCapture = new MediaCapture();
await cameraCapture.InitializeAsync();
capturePreview.Source = cameraCapture;
await cameraCapture.StartPreviewAsync();
}
private async void OnTakePhotoClick(object sender, RoutedEventArgs e)
{
// Capture a new photo or video from the device.
//https://msdn.microsoft.com/library/windows/apps/br241124
//https://azure.microsoft.com/en-us/documentation/articles/mobile-services-windows-store-dotnet-upload-data-blob-storage/
ImageEncodingProperties imgFormat = ImageEncodingProperties.CreateJpeg();
// create storage file in local app storage
media = await ApplicationData.Current.LocalFolder.CreateFileAsync(
"TestPhoto.jpg", CreationCollisionOption.GenerateUniqueName);
//CameraCaptureUI not available in universal Windows app
//https://stackoverflow.com/questions/26392977/no-basic-camera-ui-for-windows-phone-8-1
//CameraCaptureUI cameraCapture = new CameraCaptureUI();
//media = await cameraCapture.CaptureFileAsync(CameraCaptureUIMode.PhotoOrVideo);
await cameraCapture.CapturePhotoToStorageFileAsync(imgFormat, media);
// Get photo as a BitmapImage
BitmapImage bmpImage = new BitmapImage(new Uri(media.Path));
// imagePreivew is a <Image> object defined in XAML
imagePreivew.Source = bmpImage;
}