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 i jak aplikacja audio może uniemożliwić innym aplikacjom rejestrowanie odtwarzanych treści.

Jak obsługiwać token MediaProjection

Interfejs API MediaProjection umożliwia aplikacjom uzyskanie tokena MediaProjection, który daje im jednorazowy dostęp do przechwytywania treści ekranu 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 wycofanie dostępu do tokena w dowolnym momencie. W takiej sytuacji wirtualne wyświetlacze lub strumienie audio powiązane z sesją przestają odbierać strumienie multimedialne. Aplikacja musi zareagować odpowiednio. W przeciwnym razie będzie nadal nagrywać ciszę audio lub czarny strumień wideo.

Aby poradzić sobie z utratą tokena, zarejestruj wywołanie zwrotne w instancji MediaProjection przy użyciu metody registerCallback i zatrzymaj rejestrowanie po wywołaniu metody onStop.

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

Nagraj film

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

DevicePolicyManager pozwala zapobiec nagrywaniu zawartości ekranu. W przypadku kont firmowych (Android for Work) administrator może wyłączyć zbieranie danych Asystenta w profilu służbowym przy użyciu 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

Interfejs AudioPlaybackCapture API został wprowadzony w Androidzie 10. Ten interfejs API umożliwia aplikacjom kopiowanie dźwięku odtwarzanego przez inne aplikacje. Ta funkcja działa podobnie jak w przypadku przechwytywania ekranu, ale tylko 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 AudioOdtwarzanieCapture API nie wpływa na czas oczekiwania aplikacji, w której jest przechwytywany dźwięk.

Tworzenie aplikacji do przechwytywania

Ze względu na bezpieczeństwo i prywatność nagrywanie odtwarzania ma pewne ograniczenia. Aby można było rejestrować dźwięk, aplikacja musi spełniać te wymagania:

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

  1. Wywołaj AudioPlaybackCaptureConfiguration.Builder.build(), aby utworzyć AudioPlaybackCaptureConfiguration.
  2. Przekaż konfigurację do AudioRecord, wywołując metodę setAudioPlaybackCaptureConfig.

Sterowanie nagrywaniem dźwięku

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

Ograniczenie nagrywania według treści audio

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

Pamiętaj, że metod addMatchingUsage() i excludeUsage() nie można używać jednocześnie. Musisz wybrać jeden lub drugi. Nie możesz jednocześnie używać usług addMatchingUid() i excludeUid().

Ograniczenie przechwytywania przez inne aplikacje

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

Wykorzystanie

Odtwarzacz generujący dźwięk musi ustawić sposób wykorzystania na USAGE_MEDIA, USAGE_GAME lub USAGE_UNKNOWN.

Zasady przechwytywania

Zasady przechwytywania odtwarzacza muszą być ustawione na AudioAttributes.ALLOW_CAPTURE_BY_ALL, co umożliwia innym aplikacjom przechwytywanie 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, które umożliwiają przechwytywanie danych, mają zastosowanie tylko do aplikacji. Komponenty systemu Android mogą domyślnie rejestrować odtwarzanie. Wiele z tych komponentów jest dostosowywanych przez dostawców Androida i obsługuje takie funkcje jak ułatwienia dostępu i napisy. Z tego względu zalecamy, aby aplikacje umożliwiały systemowi przechwytywanie 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

Możesz wywołać AudioManager.setAllowedCapturePolicy(), aby zmienić zasadę przechwytywania podczas działania aplikacji. Jeśli w momencie wywołania tej metody odtwarza się MediaPlayer lub AudioTrack, dźwięk pozostaje bez zmian. Aby zmiana zasady została zastosowana, musisz zamknąć i ponownie otworzyć odtwarzacz lub ścieżkę.

Zasada = manifest + AudioManager + AudioAttributes

Ponieważ zasadę przechwytywania można ustawić w kilku miejscach, trzeba zrozumieć, jak jest określana skuteczna zasada. Zawsze stosowana jest najbardziej restrykcyjna zasada przechwytywania. Na przykład aplikacja, w której w manifeście zawiera właściwość setAllowedCapturePolicy="false", nigdy nie zezwala aplikacjom niesystemowym na przechwytywanie dźwięku, nawet jeśli AudioManager#setAllowedCapturePolicy ma wartość ALLOW_CAPTURE_BY_ALL. I podobnie, jeśli AudioManager#setAllowedCapturePolicy ma wartość ALLOW_CAPTURE_BY_ALL, a w manifeście ustawiona jest wartość setAllowedCapturePolicy="true", ale odtwarzacz AudioAttributes został skompilowany za pomocą AudioAttributes.Builder#setAllowedCapturePolicy(ALLOW_CAPTURE_BY_SYSTEM), aplikacje inne niż systemowe nie obsługują tego odtwarzacza.

W tabeli poniżej znajdziesz podsumowanie wpływu atrybutu pliku manifestu i obowiązującej zasady:

zezwalaj na odtwarzanie dźwięku na przechwytywanie dźwięku ALLOW_CAPTURE_BY_ALL ALLOW_CAPTURE_BY_SYSTEM ALLOW_CAPTURE_BY_NONE
true dowolna aplikacja tylko system brak przechwytywania
false tylko system tylko system brak przechwytywania