EkoostikMartin
EkoostikMartin

Reputation: 6911

Windows Phone 7 - Camera Flash App Not Functioning

In attempting to follow the instructions here - http://msdn.microsoft.com/en-us/library/hh202949.aspx I have coded a very simple WP7 app to turn on the camera flash. Everything appears to work, except....the flash doesn't activate.

My phone is Samsung SGH-I917 (latest OS update), I am using the WP7 SDK 7.1, I've checked that the flash of my camera actually does work. I have also checked to make sure the following is in the WMAppManifest.xml file.

<Capability Name="ID_CAP_ISV_CAMERA" />

The MessageBox use you see in my code below, indicates that the camera object has been initialized properly, the flashmode is supported and the FlashMode.On has been set. Yet...no flash will actually turn on. What am I missing?

Here is the code:

public partial class MainPage : PhoneApplicationPage
{
    PhotoCamera cam;        

    public MainPage()
    {
        InitializeComponent();  
    }

    protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
    {
        cam = new PhotoCamera(CameraType.Primary);
        cam.Initialized += new EventHandler<CameraOperationCompletedEventArgs>(cam_Initialized);
        cam.CaptureCompleted += new EventHandler<CameraOperationCompletedEventArgs>(cam_CaptureCompleted);
        cam.CaptureImageAvailable += new EventHandler<ContentReadyEventArgs>(cam_CaptureImageAvailable);
        cam.CaptureThumbnailAvailable += new EventHandler<ContentReadyEventArgs>(cam_CaptureThumbnailAvailable);
        viewfinderBrush.SetSource(cam);
    }

    void cam_CaptureThumbnailAvailable(object sender, ContentReadyEventArgs e)
    {
        return;
    }

    void cam_CaptureImageAvailable(object sender, ContentReadyEventArgs e)
    {
        return;
    }

    void cam_CaptureCompleted(object sender, CameraOperationCompletedEventArgs e)
    {
        return;
    }

    protected override void OnNavigatingFrom(System.Windows.Navigation.NavigatingCancelEventArgs e)
    {
        if (cam != null)
        {
            cam.Dispose();
            cam.Initialized -= cam_Initialized;
            cam.CaptureCompleted -= cam_CaptureCompleted;
            cam.CaptureImageAvailable -= cam_CaptureImageAvailable;
            cam.CaptureThumbnailAvailable -= cam_CaptureThumbnailAvailable;
        }
    }

    void cam_Initialized(object sender, CameraOperationCompletedEventArgs e)
    {
        this.Dispatcher.BeginInvoke(delegate()
        {
            MessageBox.Show("Cam Init, FlashMode.On Supported?: " + cam.IsFlashModeSupported(FlashMode.On).ToString());
        });

        return;
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        if(cam.FlashMode == FlashMode.On)
            cam.FlashMode = FlashMode.Off;
        else
            cam.FlashMode = FlashMode.On;

        this.Dispatcher.BeginInvoke(delegate()
        {
            MessageBox.Show(cam.FlashMode.ToString());
        });
    }
}

And here is the XAML:

<phone:PhoneApplicationPage 
x:Class="PhoneApp1.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">
<Grid x:Name="LayoutRoot" Background="Transparent">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
        <TextBlock x:Name="ApplicationTitle" Text="" Style="{StaticResource PhoneTextNormalStyle}"/>
        <TextBlock x:Name="PageTitle" Text="FlashLite" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
    </StackPanel>
    <Canvas x:Name="viewfinderCanvas" HorizontalAlignment="Center" >
        <Canvas.Background>
            <VideoBrush x:Name="viewfinderBrush" />
        </Canvas.Background>
    </Canvas>
    <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
        <Button Width="200" Height="100" Content="Flash" Click="Button_Click" />
    </Grid>
</Grid>

Upvotes: 1

Views: 1736

Answers (1)

Olivier Payen
Olivier Payen

Reputation: 15268

cam.FlashMode = FlashMode.On;

only indicates that the flash will be activated when capturing the image.

That is achieved by doing

cam.CaptureImage();

EDIT : If you only want to trigger the flash, you can just call cam.Focus();

Upvotes: 2

Related Questions