Camera Capture Task in Windows Phone 7 via WCF Service Messaging


Introduction

In this article let's learn one better concept in windows phone which communicates with WCF Service to retrieve some friendly message to user. Once this application is fully developed and deployed it enables to take photo using application with inbuilt camera. Later, can able to view the taken photo images.

Question Arises: What is Camera Capture Task?

In simple terms "It enables to take photos using this application with inbuilt camera."

Let's get this started now!!

Step 1 : The Complete Code of IService1.cs looks like this:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;
namespace Camera_WCF
{
   
// NOTE: You can use the "Rename" command on the "Refactor" menu to change the interface name "IService1" in both code and config file together.
    [ServiceContract]
    public interface IService1 { [OperationContract] string Capture(); }
}


Step 2 : The Complete Code of Service1.svc.cs looks like this:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;
namespace Camera_WCF
{
   
// NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "Service1" in code, svc and config file together.
    public class Service1 : IService1
    {
        public string Capture()
        {
            return " Hurray !!! It's Message from WCF for Camera Task ";
        }
    }
}

Step 3 : The Complete Code of Web.Config looks like this:

<?xml version="1.0"?>
<configuration>
       <
system.web>
              <
compilation debug="true" targetFramework="4.0" />
       </system.web>
       <
system.serviceModel>
              <
behaviors>
                     <
serviceBehaviors>
                           <
behavior>
                                  <!--
To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before
deployment
-->
                                  <
serviceMetadata httpGetEnabled="true"/>
                                  <!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information -->
                                  <
serviceDebug includeExceptionDetailInFaults="false"/>
                           </behavior>
                     </
serviceBehaviors>
              </
behaviors>
              <
serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
       </system.serviceModel>
       <
system.webServer>
              <
modules runAllManagedModulesForAllRequests="true"/>
       </system.webServer>
</
configuration>

Step 4 : The Complete Code of MainPage.xaml looks like this:

<phone:PhoneApplicationPage x:Class="Camera_Capture_Task.MainPage"
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" mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="768" FontFamily=
{
StaticResource PhoneFontFamilyNormal}" FontSize="{StaticResource PhoneFontSizeNormal}" Foreground="{StaticResource PhoneForegroundBrush}"

SupportedOrientations="Portrait" Orientation="Portrait" shell:SystemTray.IsVisible="True">

    <!--LayoutRoot is the root grid where all page content is placed-->
    <Grid x:Name="LayoutRoot" Background="Transparent">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <!--TitlePanel contains the name of the application and page title-->

        <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
            <TextBlock x:Name="ApplicationTitle" Text="Vijay's Camera Capture Application" Style="{StaticResource PhoneTextNormalStyle}"/>
            <TextBlock x:Name="PageTitle" Text="Windows 7 Phone" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
        </StackPanel>
        <!--ContentPanel - place additional content here-->
        <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
            <Image Height="234" HorizontalAlignment="Left" Margin="75,342,0,0" Name="image1" Stretch="Fill" VerticalAlignment="Top" Width="329" />
            <Button Content="Capture" FontFamily="Verdana" FontSize="22" Height="72" HorizontalAlignment="Left" Margin="145,155,0,0" Name="button1"
VerticalAlignment="Top" Width="160" Click="button1_Click" />
        </Grid>
    </Grid>   
</phone:PhoneApplicationPage>

Step 5 : The Complete Code of MainPage.xaml.cs looks like this:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;
using Microsoft.Phone.Tasks;
using System.Windows.Media.Imaging;
using Camera_Capture_Task.ServiceReference1;
namespace Camera_Capture_Task
{
    public partial class MainPage : PhoneApplicationPage
    {
       
// Constructor
        public MainPage()
        {
            InitializeComponent();
        }
        static void capture_Call(object sender, CaptureCompletedEventArgs e)
        {
            MessageBox.Show(e.Result);
        }
        private void button1_Click(object sender, RoutedEventArgs e)
        {
            objClient.CaptureCompleted += new EventHandler<CaptureCompletedEventArgs>(capture_Call);
            objClient.CaptureAsync();
            objCapture_Task.Completed += new EventHandler<PhotoResult>(capture_Completed);
            objCapture_Task.Show();
        }
        void capture_Completed(object sender, PhotoResult e)
        {
            switch(e.TaskResult)
            {
                case TaskResult.OK: BitmapImage objImage = new BitmapImage();
                    objImage.SetSource(e.ChosenPhoto);
                    image1.Source = objImage;
                    break;
                case TaskResult.Cancel: MessageBox.Show("Capture Cancelled");
                    break;
                case TaskResult.None: MessageBox.Show("Capture Cannot be Operated");
                    break;
            }
        }
        #region Class Objects Service1Client objClient = new Service1Client();
        CameraCaptureTask objCapture_Task = new CameraCaptureTask(); #endregion
    }
}


Step 6 : The Output of the Application looks like this:

windowsphone.gif

I hope this article is useful for you. I look forward for your comments and feedback.

Thanks Vijay Prativadi.

MVC Corporation
MVC Corporation is consulting and IT services based company.