Nagrywaj filmy i dźwięki

Aplikacja może nagrywać film lub dźwięk odtwarzany z innej aplikacji. Takie aplikacje muszą poprawnie obsługiwać token MediaProjection. Na tej stronie dowiesz się, jak to zrobić. Pokazuje też, jak administrator urządzenia może wyłączyć możliwość nagrywania zrzutów ekranu oraz jak aplikacja audio może uniemożliwić innym aplikacjom nagrywanie odtwarzanych przez nią treści.

Jak postępować z tokenem MediaProjection

Interfejs API MediaProjection pozwala aplikacjom na uzyskanie tokena MediaProjection, który zapewnia jednorazowy dostęp do treści na ekranie lub dźwięku. System operacyjny Android prosi użytkownika o zgodę przed przyznaniem tokena aplikacji.

System operacyjny wyświetla aktywne tokeny MediaProjection w interfejsie Szybkich ustawień i umożliwia użytkownikom w dowolnym momencie cofnięcie dostępu do tokena. W takim przypadku wirtualne wyświetlacze lub strumienie audio powiązane z sesją przestają otrzymywać strumienie multimediów. Aplikacja musi odpowiednio zareagować, w przeciwnym razie będzie nadal rejestrować ciszę lub czarny strumień wideo.

Aby obsłużyć utratę tokena, zarejestruj wywołanie zwrotne w obiekcie MediaProjection, używając metody registerCallback, i zatrzymaj nagrywanie po wywołaniu metody onStop.

Więcej informacji znajdziesz w artykule Wyświetlanie multimediów.

Nagraj film

Aby dowiedzieć się, jak używać interfejsu MediaProjection API do przechwytywania ekranu urządzenia w czasie rzeczywistym i wyświetlania go w interfejsie SurfaceView, zapoznaj się z przykładową aplikacją ScreenCapture.

Aby zapobiec nagrywaniu ekranu, możesz użyć DevicePolicyManager. W przypadku kont firmowych (Androida dla firm) administrator może wyłączyć zbieranie danych asystenta na profilu służbowym, używając metody setScreenCaptureDisabled.

Z ćwiczenia w Codelabs dowiesz się, jak zarządzać urządzeniami z Androidem bez aplikacji. Dowiesz się z niego, jak zablokować możliwość wykonywania zrzutów ekranu.

Przechwytywanie odtwarzania dźwięku

W Androidzie 10 wprowadzono interfejs AudioPlaybackCapture API. Ten interfejs API umożliwia aplikacjom kopiowanie dźwięku odtwarzanego przez inne aplikacje. Ta funkcja jest odpowiednikiem przechwytywania ekranu, ale w przypadku dźwięku. Zasadniczo korzysta się z nich do odtwarzania strumieniowego, które chcą rejestrować dźwięk w grach.

Pamiętaj, że interfejs AudioPlaybackCapture API nie wpływa na opóźnienie aplikacji, której dźwięk jest rejestrowany.

Tworzenie aplikacji do przechwytywania

Ze względów bezpieczeństwa i prywatności nagrywanie odtwarzania wiąże się z pewnymi ograniczeniami. Aby aplikacja mogła rejestrować dźwięk, musi spełniać te wymagania:

Aby rejestrować dźwięk z innej aplikacji, Twoja aplikacja musi utworzyć obiekt AudioRecord i dodać do niego obiekt AudioPlaybackCaptureConfiguration. Wykonaj te czynności:

  1. Zadzwoń pod numer AudioPlaybackCaptureConfiguration.Builder.build(), aby utworzyć AudioPlaybackCaptureConfiguration.
  2. Przekaż konfigurację do AudioRecord, wywołując funkcję setAudioPlaybackCaptureConfig.

Sterowanie rejestrowaniem dźwięku

Aplikacja ma kontrolę nad tym, jakie rodzaje treści może nagrywać i jakie inne aplikacje mogą nagrywać swoje odtwarzanie.

Ograniczenie przechwytywania treści audio

Aplikacja może ograniczyć przechwytywanie dźwięku za pomocą tych metod:

Pamiętaj, że nie możesz używać metod addMatchingUsage() i excludeUsage() jednocześnie. Musisz wybrać jeden lub drugi. Podobnie nie możesz używać jednocześnie właściwości addMatchingUid()excludeUid().

Ograniczenie możliwości przechwytywania przez inne aplikacje

Możesz skonfigurować aplikację, aby uniemożliwić innym aplikacjom rejestrowanie dźwięku. Dźwięk z aplikacji może być rejestrowany tylko wtedy, gdy aplikacja spełnia te wymagania:

Wykorzystanie

Odtwarzacz, który generuje dźwięk, musi ustawić jego użycie na USAGE_MEDIA, USAGE_GAME lub USAGE_UNKNOWN.

Zasady przechwytywania

Zasady dotyczące nagrywania przez odtwarzacz muszą być zgodne z AudioAttributes.ALLOW_CAPTURE_BY_ALL, co pozwala innym aplikacjom na nagrywanie odtwarzania. Można to zrobić na kilka sposobów:

Jeśli spełniasz te wymagania wstępne, można przechwytywać każdy dźwięk wygenerowany przez odtwarzacz.

Wyłączanie przechwytywania systemu

Opisane powyżej zabezpieczenia umożliwiające rejestrowanie dotyczą tylko aplikacji. Komponenty systemu Android domyślnie mogą rejestrować odtwarzanie. Wiele z tych komponentów jest dostosowywanych przez dostawców Androida i obsługuje funkcje takie jak ułatwienia dostępu czy napisy. Dlatego zalecamy, aby aplikacje zezwalały systemowi na rejestrowanie odtwarzania. W rzadkich przypadkach, gdy nie chcesz, aby system przechwytywał odtwarzanie aplikacji, ustaw zasadę przechwytywania na ALLOW_CAPTURE_BY_NONE.

Ustawianie zasad w czasie działania

Aby zmienić politykę przechwytywania podczas działania aplikacji, możesz wywołać funkcję AudioManager.setAllowedCapturePolicy(). Jeśli w momencie wywołania metody odtwarzany jest MediaPlayer lub AudioTrack, dźwięk nie zostanie zmieniony. Aby zmiana zasady zaczęła obowiązywać, musisz zamknąć i ponownie otworzyć odtwarzacz lub ścieżkę.

Zasady = manifest + AudioManager + AudioAttributes

Ponieważ zasadę przechwytywania można ustawić w kilku miejscach, trzeba zrozumieć, jak jest określana skuteczna zasada. Zawsze stosuje się najbardziej restrykcyjną zasadę przechwytywania. Na przykład aplikacja, której manifest zawiera wartość setAllowedCapturePolicy="false", nigdy nie pozwoli aplikacjom niesystemowym na rejestrowanie dźwięku, nawet jeśli parametr AudioManager#setAllowedCapturePolicy jest ustawiony na wartość ALLOW_CAPTURE_BY_ALL. Podobnie, jeśli AudioManager#setAllowedCapturePolicy ma wartość ALLOW_CAPTURE_BY_ALL, a plik manifestowy ma wartość setAllowedCapturePolicy="true", ale odtwarzacz multimediów AudioAttributes został utworzony z wartością AudioAttributes.Builder#setAllowedCapturePolicy(ALLOW_CAPTURE_BY_SYSTEM), aplikacje inne niż systemowe nie będą mogły go przechwycić.

Tabela poniżej podsumowuje wpływ atrybutu pliku manifestu i obowiązujących zasad:

allowAudioPlaybackCapture ALLOW_CAPTURE_BY_ALL ALLOW_CAPTURE_BY_SYSTEM ALLOW_CAPTURE_BY_NONE
prawda dowolna aplikacja tylko system brak przechwytywania
fałsz tylko system tylko system brak przechwytywania