Reputation: 6911
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
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