Как узнать, что камера в настоящее время используется другим приложением с UWP?

Я пытаюсь показать сообщение об ошибке «Не удается настроить камеру; в настоящее время используется», когда уже запущен процесс, запускающий камеру. У меня есть код, который запускает предварительный просмотр с помощью MediaCapture, и он отлично работает без другого приложения, использующего камеру. Я получаю исключение

0x40080201: ошибка источника WinRT (параметры: 0xC00D3704, 0x00000049, 0x10EFF1CC)

в моих журналах, но мой блок try catch не обнаруживает ошибку.

create_task(_mediaCapture->StartPreviewToCustomSinkAsync(encoding_profile, media_sink)).then([this, &hr](task<void>& info) {
    try {
         info.get();
    } catch (Exception^ e) {
        hr = e->HResult;
    }
}).wait();

person surajp    schedule 10.06.2017    source источник


Ответы (1)


StartPreviewAsync вызовет метод < strong> FileLoadException, если другое приложение имеет исключительный контроль над устройством захвата. Мы можем поймать эту ошибку, чтобы предупредить пользователя о том, что камера в настоящее время используется другим приложением. Простой образец можно найти по адресу Используйте MediaCapture для запуска потока предварительного просмотра.

Однако это пример C #, а FileLoadException - это то, что используется в .Net. Для C ++ / CX мы можем проверить значение HRESULT, которое должно быть 0x80070020. Ниже приведен простой пример в версии C ++ / CX.

MainPage.xaml

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <CaptureElement Name="PreviewControl" Stretch="Uniform"/>
    <Button Click="Button_Click">Click</Button>
</Grid>

MainPage.xaml.h

public ref class MainPage sealed
{
public:
    MainPage();

private:
    // Prevent the screen from sleeping while the camera is running
    Windows::System::Display::DisplayRequest^ _displayRequest;

    // MediaCapture
    Platform::Agile<Windows::Media::Capture::MediaCapture^> _mediaCapture;

    void Button_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e);
};

MainPage.xaml.cpp

MainPage::MainPage()
    : _mediaCapture(nullptr)
    , _displayRequest(ref new Windows::System::Display::DisplayRequest())
{
    InitializeComponent();
}


void MainPage::Button_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
{
    _mediaCapture = ref new Windows::Media::Capture::MediaCapture();
    create_task(_mediaCapture->InitializeAsync())
        .then([this](task<void> previousTask) {
        try
        {
            previousTask.get();
            _displayRequest->RequestActive();
            Windows::Graphics::Display::DisplayInformation::AutoRotationPreferences = Windows::Graphics::Display::DisplayOrientations::Landscape;
            PreviewControl->Source = _mediaCapture.Get();
            create_task(_mediaCapture->StartPreviewAsync())
                .then([this](task<void>& previousTask)
            {
                try
                {
                    previousTask.get();
                }
                catch (Exception^ exception)
                {
                    if (exception->HResult == 0x80070020)
                    {
                        auto messageDialog = ref new Windows::UI::Popups::MessageDialog("Cannot setup camera; currently being using.");
                        create_task(messageDialog->ShowAsync());
                    }
                }
            });
        }
        catch (AccessDeniedException^)
        {
            auto messageDialog = ref new Windows::UI::Popups::MessageDialog("The app was denied access to the camera.");
            create_task(messageDialog->ShowAsync());
        }
    });
}

StartPreviewAsync, а также может вызывать FileLoadException. Вы сможете справиться с этим таким же образом. Для получения дополнительной информации см. Также Обработка изменений в монопольном управлении.

person Jay Zuo    schedule 14.06.2017