Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W tym artykule opisano sposób szybkiego wyświetlania strumienia podglądu aparatu na stronie XAML w aplikacji UWP. Utworzenie aplikacji, która przechwytuje zdjęcia i filmy wideo przy użyciu aparatu, wymaga wykonywania zadań, takich jak obsługa orientacji urządzenia i aparatu lub ustawianie opcji kodowania przechwyconego pliku. W niektórych scenariuszach aplikacji można po prostu wyświetlić podgląd z kamery i nie martwić się o inne kwestie. W tym artykule pokazano, jak to zrobić z minimalnym kodem. Pamiętaj, że zawsze należy prawidłowo zamknąć strumień podglądu, gdy skończysz z niego korzystać, wykonując poniższe kroki.
Aby uzyskać informacje na temat pisania aplikacji aparatu, która przechwytuje zdjęcia lub filmy wideo, zobacz Podstawowe zdjęcia, wideo i przechwytywanie audio w usłudze MediaCapture.
Dodawanie deklaracji możliwości do manifestu aplikacji
Aby aplikacja mogła uzyskać dostęp do aparatu urządzenia, należy zadeklarować, że aplikacja korzysta z funkcji urządzenia, takich jak kamera internetowa i mikrofon.
Dodawanie możliwości do manifestu aplikacji
- W programie Microsoft Visual Studio w eksploratorze rozwiązań otwórz projektanta manifestu aplikacji, klikając dwukrotnie element package.appxmanifest.
- Wybierz kartę Możliwości .
- Zaznacz pole wyboru Kamera internetowa i pole wyboru Mikrofon.
Dodawanie elementu CaptureElement do strony
Aby wyświetlić strumień podglądu na stronie XAML, użyj CaptureElement.
<CaptureElement Name="PreviewControl" Stretch="Uniform"/>
Uruchamianie strumienia w wersji zapoznawczej za pomocą usługi MediaCapture
Obiekt MediaCapture jest interfejsem aplikacji do aparatu urządzenia. Ta klasa jest członkiem przestrzeni nazw Windows.Media.Capture. W przykładzie w tym artykule używane są również interfejsy API z Windows.ApplicationModel i System.Threading.Tasks przestrzeni nazw, oprócz tych dołączonych przez domyślny szablon projektu.
Dodaj dyrektywy using, aby uwzględnić następujące przestrzenie nazw w pliku .cs strony.
//MainPage.xaml.cs
using Windows.UI.Core;
using Windows.UI.Xaml.Navigation;
using Windows.Media.Capture;
using Windows.ApplicationModel;
using System.Threading.Tasks;
using Windows.System.Display;
using Windows.Graphics.Display;
Zadeklaruj zmienną składową klasy dla obiektu MediaCapture i zmienną logiczną, aby śledzić, czy aparat jest obecnie w trybie podglądu.
MediaCapture mediaCapture;
bool isPreviewing;
Zadeklaruj zmienną typu DisplayRequest , która będzie używana do upewnienia się, że ekran nie jest wyłączony podczas uruchamiania podglądu.
DisplayRequest displayRequest = new DisplayRequest();
Utwórz metodę pomocnika o nazwie StartPreviewAsync, aby uruchomić podgląd aparatu w tym przykładzie. W zależności od scenariusza aplikacji możesz wywołać tę metodę w obsłudze zdarzenia OnNavigatedTo, która jest wywoływana po załadowaniu strony, lub poczekać i uruchomić podgląd w odpowiedzi na zdarzenia interfejsu użytkownika.
Utwórz nowe wystąpienie klasy MediaCapture i wywołaj InitializeAsync, aby zainicjować urządzenie przechwytywania. Ta metoda może zakończyć się niepowodzeniem na urządzeniach, które na przykład nie mają aparatu fotograficznego, dlatego należy ją wywołać w bloku try. Wyjątek
Ważny W niektórych rodzinach urządzeń zostanie wyświetlony monit o wyrażenie zgody użytkownika przed udzieleniem aplikacji dostępu do aparatu urządzenia. Z tego powodu należy wywołać tylko MediaCapture.InitializeAsync z głównego wątku interfejsu użytkownika. Próba zainicjowania aparatu z innego wątku może spowodować niepowodzenie inicjowania.
Uwaga / Notatka
System Windows umożliwia użytkownikom udzielanie lub odmawianie dostępu do aparatu urządzenia w ustawieniach systemu Windows w obszarze Prywatność i zabezpieczenia —> aparat fotograficzny. Podczas inicjowania urządzenia do przechwytywania aplikacje powinny sprawdzać, czy mają dostęp do aparatu, i obsługiwać przypadek odmowy dostępu przez użytkownika. Aby uzyskać więcej informacji, zobacz Handle the Windows camera privacy setting (Obsługa ustawienia prywatności aparatu systemu Windows).
Połącz
Wywołaj metodę RequestActive, aby upewnić się, że urządzenie nie przejdzie w stan uśpienia, gdy wersja zapoznawcza jest uruchomiona. Na koniec ustaw właściwość DisplayInformation.AutoRotationPreferences na tryb krajobraz, aby zapobiec rotacji interfejsu użytkownika i CaptureElement podczas zmiany orientacji urządzenia przez użytkownika. Aby uzyskać więcej informacji na temat obsługi zmian orientacji urządzenia, zobacz Obsługa orientacji urządzenia za pomocą MediaCapture.
private async Task StartPreviewAsync()
{
try
{
mediaCapture = new MediaCapture();
await mediaCapture.InitializeAsync();
displayRequest.RequestActive();
DisplayInformation.AutoRotationPreferences = DisplayOrientations.Landscape;
}
catch (UnauthorizedAccessException)
{
// This will be thrown if the user denied access to the camera in privacy settings
ShowMessageToUser("The app was denied access to the camera");
return;
}
try
{
PreviewControl.Source = mediaCapture;
await mediaCapture.StartPreviewAsync();
isPreviewing = true;
}
catch (System.IO.FileLoadException)
{
mediaCapture.CaptureDeviceExclusiveControlStatusChanged += _mediaCapture_CaptureDeviceExclusiveControlStatusChanged;
}
}
Obsługa zmian w wyłącznej kontroli
Zgodnie z opisem w poprzedniej sekcji, StartPreviewAsync wyrzuci wyjątek FileLoadException, jeśli inna aplikacja ma ekskluzywną kontrolę nad urządzeniem przechwytywania. Począwszy od systemu Windows 10 w wersji 1703, można zarejestrować obsługę zdarzenia dla MediaCapture.CaptureDeviceExclusiveControlStatusChanged, które wywoływane jest za każdym razem, gdy zmienia się status wyłącznej kontroli nad urządzeniem. W obsłudze tego zdarzenia sprawdź właściwość MediaCaptureDeviceExclusiveControlStatusChangedEventArgs.Status, aby ustalić, jaki jest bieżący status. Jeśli nowy stan to SharedReadOnlyAvailable, to wiesz, że obecnie nie można uruchomić podglądu. Możesz zaktualizować interfejs użytkownika, aby powiadomić o tym użytkownika. Jeśli nowy stan to ExclusiveControlAvailable, możesz spróbować ponownie uruchomić podgląd aparatu.
private async void _mediaCapture_CaptureDeviceExclusiveControlStatusChanged(MediaCapture sender, MediaCaptureDeviceExclusiveControlStatusChangedEventArgs args)
{
if (args.Status == MediaCaptureDeviceExclusiveControlStatus.SharedReadOnlyAvailable)
{
ShowMessageToUser("The camera preview can't be displayed because another app has exclusive access");
}
else if (args.Status == MediaCaptureDeviceExclusiveControlStatus.ExclusiveControlAvailable && !isPreviewing)
{
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async () =>
{
await StartPreviewAsync();
});
}
}
Zamykanie strumienia podglądu
Po zakończeniu korzystania ze strumienia w wersji zapoznawczej należy zawsze zamknąć strumień i prawidłowo usunąć skojarzone zasoby, aby upewnić się, że aparat jest dostępny dla innych aplikacji na urządzeniu. Wymagane kroki zamykania strumienia w wersji zapoznawczej to:
- Jeśli aparat obecnie wyświetla podgląd, wywołaj StopPreviewAsync, aby zatrzymać strumień podglądu. Wyjątek zostanie zgłoszony, jeśli wywołasz metodę StopPreviewAsync , gdy wersja zapoznawcza nie jest uruchomiona.
- Ustaw właściwość Source elementu CaptureElement na wartość null. Aby upewnić się, że to wywołanie jest wykonywane w wątku interfejsu użytkownika, użyj CoreDispatcher.RunAsync.
- Wywołaj metodę MediaCapture obiektu Dispose, aby zwolnić obiekt. Ponownie użyj narzędzia CoreDispatcher.RunAsync , aby upewnić się, że to wywołanie jest wykonywane w wątku interfejsu użytkownika.
- Ustaw zmienną składową MediaCapture na wartość null.
- Wywołaj RequestRelease, aby umożliwić wyłączenie ekranu, gdy jest nieaktywny.
private async Task CleanupCameraAsync()
{
if (mediaCapture != null)
{
if (isPreviewing)
{
await mediaCapture.StopPreviewAsync();
}
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
PreviewControl.Source = null;
if (displayRequest != null)
{
displayRequest.RequestRelease();
}
mediaCapture.Dispose();
mediaCapture = null;
});
}
}
Strumień podglądu należy zamknąć, kiedy użytkownik opuszcza stronę, przesłaniając metodę OnNavigatedFrom.
protected async override void OnNavigatedFrom(NavigationEventArgs e)
{
await CleanupCameraAsync();
}
Należy również prawidłowo zamknąć strumień w wersji zapoznawczej, gdy aplikacja jest zawieszana. W tym celu zarejestruj procedurę obsługi dla zdarzenia Application.Suspending w konstruktorze strony.
public MainPage()
{
this.InitializeComponent();
Application.Current.Suspending += Application_Suspending;
}
W procedurze obsługi zdarzenia Wstrzymania najpierw upewnij się, że strona jest wyświetlana w Ramce aplikacji, porównując typ strony z właściwością CurrentSourcePageType. Jeśli strona nie jest obecnie wyświetlana, zdarzenie OnNavigatedFrom powinno już zostać podniesione, a strumień podglądu powinien być już wyłączony. Jeśli strona jest obecnie wyświetlana, pobierz obiekt SuspendingDeferral z argumentów zdarzenia przekazanych do procedury obsługi, aby upewnić się, że system nie zawiesi Twojej aplikacji, dopóki strumień podglądu nie zostanie zamknięty. Po zamknięciu strumienia wywołaj metodę Complete, aby umożliwić systemowi dalsze zawieszanie aplikacji.
private async void Application_Suspending(object sender, SuspendingEventArgs e)
{
// Handle global application events only if this page is active
if (Frame.CurrentSourcePageType == typeof(MainPage))
{
var deferral = e.SuspendingOperation.GetDeferral();
await CleanupCameraAsync();
deferral.Complete();
}
}