Windows (телефон) 8.1 Использование камеры

Я создаю универсальное приложение Windows. Я хочу, чтобы пользователь мог загрузить изображение, и пользователь должен иметь возможность взять его на месте и отправить. У меня это работает с использованием API 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);

    return deviceID;
}

Однако для меня это всегда возвращает значение null, поскольку идентификатор устройства всегда равен нулю.

В качестве альтернативы есть ли возможность передать управление приложению, которое делает снимок и возвращает сделанное изображение моему приложению? Я обнаружил следующее, но оно не работает для универсальных приложений Windows: http://msdn.microsoft.com/en-us/library/windows/apps/hh394006(v=vs.105).aspx


person WereWolfBoy    schedule 01.10.2014    source источник
comment
Может попробовать запустить в режиме отладки строчку: var devices = (await DeviceInformation.FindAllAsync(DeviceClass.All)).ToList();, потом проверить какие устройства возвращаются? Сможете ли вы найти там камеры?   -  person Romasz    schedule 01.10.2014


Ответы (1)


Вот как бы я это сделал:

Первая часть инициализации

// First need to find all webcams
DeviceInformationCollection webcamList = await DeviceInformation.FindAllAsync(DeviceClass.All)

// Then I do a query to find the front webcam
DeviceInformation frontWebcam = (from webcam in webcamList
 where webcam.EnclosureLocation != null 
 && webcam.EnclosureLocation.Panel == Windows.Devices.Enumeration.Panel.Front
 select webcam).FirstOrDefault();

// Same for the back webcam
DeviceInformation backWebcam = (from webcam in webcamList
 where webcam.EnclosureLocation != null 
 && webcam.EnclosureLocation.Panel == Windows.Devices.Enumeration.Panel.Back
 select webcam).FirstOrDefault();

// Then you need to initialize your MediaCapture
newCapture  = new MediaCapture();
await newCapture.InitializeAsync(new MediaCaptureInitializationSettings
        {
            // Choose the webcam you want
            VideoDeviceId = backWebcam.Id,
            AudioDeviceId = "",
            StreamingCaptureMode = StreamingCaptureMode.Video,
            PhotoCaptureSource = PhotoCaptureSource.VideoPreview
        });

// Set the source of the CaptureElement to your MediaCapture
// (In my XAML I called the CaptureElement *Capture*)
Capture.Source = newCapture;

// Start the preview
await newCapture.StartPreviewAsync();

Во-вторых, сфотографируйте

//Set the path of the picture you are going to take
StorageFolder folder = ApplicationData.Current.LocalFolder;
var picPath = "\\Pictures\\newPic.jpg";

StorageFile captureFile = await folder.CreateFileAsync(picPath, CreationCollisionOption.GenerateUniqueName);

ImageEncodingProperties imageProperties = ImageEncodingProperties.CreateJpeg();

//Capture your picture into the given storage file
await newCapture.CapturePhotoToStorageFileAsync(imageProperties, captureFile);

Это должно решить вашу проблему.

person Aurelien Souchet    schedule 02.10.2014