Хорошо, мой вопрос прост:
Как сделать снимок с помощью Windows Store App
для Windows Phone 8.1
, используя камеру?
Образцы в MSDN используют Windows.Media.Capture.CameraCaptureUI
, который нельзя использовать на Windows Phone или для Silverlight
.
Я не могу найти какой-либо документ или образец специально для приложения Windows Phone, используя Windows Runtime.
Если кто-то знает или даже получит документ для этого, я был бы рад.
Захват фотографии в приложении Windows Store для Windows Phone
Ответ 1
В WP8.1 Runtime (также в Silverlight) вы можете использовать MediaCapture. Короче говоря:
// First you will need to initialize MediaCapture
Windows.Media.Capture.MediaCapture takePhotoManager = new Windows.Media.Capture.MediaCapture();
await takePhotoManager.InitializeAsync();
Если вам нужен предварительный просмотр, вы можете использовать CaptureElement:
// In XAML:
<CaptureElement x:Name="PhotoPreview"/>
Затем в коде позади вы можете запустить/остановить просмотр следующим образом:
// start previewing
PhotoPreview.Source = takePhotoManager;
await takePhotoManager.StartPreviewAsync();
// to stop it
await takePhotoManager.StopPreviewAsync();
Наконец, чтобы взять фотографию, вы можете, например, перенести ее непосредственно в файл CapturePhotoToStorageFileAsync или в поток CapturePhotoToStreamAsync:
ImageEncodingProperties imgFormat = ImageEncodingProperties.CreateJpeg();
// a file to save a photo
StorageFile file = await ApplicationData.Current.LocalFolder.CreateFileAsync(
"Photo.jpg", CreationCollisionOption.ReplaceExisting);
await takePhotoManager.CapturePhotoToStorageFileAsync(imgFormat, file);
Если вы хотите захватить видео, то вот более подробная информация.
Также не забудьте добавить Webcam
в Capabilities
вашего файла манифеста и Front/Rear Camera
в Requirements
.
Если вам нужно выбрать камеру (fornt/back), вам нужно будет получить идентификатор камеры и затем инициализировать MediaCapture
с помощью необходимых настроек:
private static async Task<DeviceInformation> GetCameraID(Windows.Devices.Enumeration.Panel desired)
{
DeviceInformation deviceID = (await DeviceInformation.FindAllAsync(DeviceClass.VideoCapture))
.FirstOrDefault(x => x.EnclosureLocation != null && x.EnclosureLocation.Panel == desired);
if (deviceID != null) return deviceID;
else throw new Exception(string.Format("Camera of type {0} doesn't exist.", desired));
}
async private void InitCamera_Click(object sender, RoutedEventArgs e)
{
var cameraID = await GetCameraID(Windows.Devices.Enumeration.Panel.Back);
captureManager = new MediaCapture();
await captureManager.InitializeAsync(new MediaCaptureInitializationSettings
{
StreamingCaptureMode = StreamingCaptureMode.Video,
PhotoCaptureSource = PhotoCaptureSource.Photo,
AudioDeviceId = string.Empty,
VideoDeviceId = cameraID.Id
});
}
Ответ 2
В универсальных приложениях Windows Phone 8.1 (WinRT) уже невозможно перейти непосредственно во встроенное приложение камеры и получить обратный вызов при съемке.
Для этого вам нужно реализовать Windows.Media.Capture.MediaCapture
, как описано выше. Раньше он был CameraCatureUI
, но он недоступен в приложениях WinRT для Windows Phone 8.1.
Однако существует "обходной путь". Вы можете использовать Windows.Storage.Pickers.FileOpenPicker
и настроить его для выбора изображений. Теперь у сборщика будет кнопка камеры. Пользователь может щелкнуть по кнопке камеры, и откроется приложение для встроенной камеры. Как только пользователь сделает снимок, вы получите обратный вызов в своем приложении. Обратный вызов FileOpenPicker
немного раздражает для реализации, но он работает. Если вы можете жить с последствиями юзабилити, это может быть приемлемым подходом.
В ходе конференции Microsoft по строительству-конференции в 2014 году был проведен сеанс. Вы можете смотреть сеанс онлайн по этой ссылке.
Ответ 3
Вы можете использовать подход эту ссылку. Все объясняется очень хорошо.
Просто используйте класс PhotoCamera
и не забудьте включить использование камеры в манифесте приложения.