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 umożliwia aplikacjom pobieranie tokena MediaProjection, który zapewnia jednorazowy dostęp do treści na ekranie lub dźwięku. System operacyjny Android prosi użytkownika o pozwolenie, zanim przyzna token Twojej aplikacji.

System operacyjny wyświetla aktywne tokeny MediaProjection w interfejsie Szybkie ustawienia i umożliwia użytkownikom w dowolnym momencie cofnięcie dostępu do tokena. W takiej sytuacji 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 Projekcja 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 dla firm (Androida dla firm) administrator może wyłączyć zbieranie danych asystenta na profilu służbowym, używając metody setScreenCaptureDisabled.

W laboratorium kodu Zarządzanie urządzeniami z Androidem bez użycia aplikacji znajdziesz informacje o tym, 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. Głównym przypadkiem użycia jest przesyłanie strumieniowe aplikacji, które chcą rejestrować dźwięk odtwarzany przez gry.

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 może kontrolować, jakie typy treści może nagrywać, oraz jakie inne aplikacje mogą nagrywać jej odtwarzanie.

Ograniczenie przechwytywania według treści audio

Aplikacja może ograniczyć dźwięk, który może rejestrować, 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 dotyczące przechwytywania

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

Jeśli te wymagania są spełnione, można rejestrować dźwięk wytwarzany 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 rejestrował odtwarzanie aplikacji, ustaw zasadę rejestrowania 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 zmiany w zasadach zaczęły obowiązywać, musisz zamknąć odtwarzacz lub ścieżkę i ponownie je otworzyć.

Zasady = manifest + AudioManager + AudioAttributes

Ponieważ zasadę przechwytywania można określić w kilku miejscach, ważne jest, aby wiedzieć, jak określana jest obowiązująca 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