Nagrywaj filmy i dźwięki

Aplikacja może nagrywać wideo lub dźwięk odtwarzany z innej aplikacji. Takie aplikacje muszą prawidłowo obsługiwać token MediaProjection. Na tej stronie dowiesz się, jak to zrobić. Wyjaśniamy 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.

Postępowanie z tokenem MediaProjection

Interfejs MediaProjection API umożliwia aplikacjom uzyskanie tokena MediaProjection, który zapewnia jednorazowy dostęp do przechwytywania zawartości ekranu lub dźwięku. System operacyjny Android poprosi użytkownika o zgodę przed przyznaniem tokena aplikacji.

System operacyjny wyświetla aktywne tokeny MediaProjection w interfejsie Ustawień szybkich i umożliwia użytkownikom cofnięcie dostępu do tokena w dowolnym momencie. W takiej sytuacji wirtualne wyświetlacze lub strumienie audio powiązane z sesją przestają odbierać strumienie multimediów. Aplikacja musi odpowiednio reagować, w przeciwnym razie będzie nadal nagrywać ciszę lub czarny strumień wideo.

Aby poradzić sobie z utratą tokena, zarejestruj wywołanie zwrotne w instancji MediaProjection za pomocą metody registerCallback i zatrzymaj nagrywanie, gdy zostanie wywołana metoda onStop.

Więcej informacji znajdziesz w artykule Projekcja multimediów.

Nagraj film

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

Możesz użyć DevicePolicyManager, aby zapobiec nagrywaniu ekranu. W przypadku kont firmowych (Android for Work) administrator może wyłączyć zbieranie danych asystenta w profilu służbowym za pomocą metody setScreenCaptureDisabled.

W samouczku Zarządzanie urządzeniami z Androidem bez aplikacji znajdziesz informacje o tym, jak zabronić robienia zrzutów ekranu.

Przechwytywanie odtwarzania dźwięku

AudioPlaybackCapture API został wprowadzony w Androidzie 10. Ten interfejs API umożliwia aplikacjom kopiowanie dźwięku odtwarzanego przez inne aplikacje. Ta funkcja jest odpowiednikiem zrzutu ekranu, ale w przypadku dźwięku. Głównym przypadkiem użycia jest przesyłanie strumieniowe aplikacji, które chcą przechwytywać dźwięk odtwarzany przez gry.

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

Tworzenie aplikacji do przechwytywania

Ze względu na bezpieczeństwo i prywatność przechwytywanie odtwarzania podlega pewnym ograniczeniom. Aby aplikacja mogła rejestrować dźwięk, musi spełniać te wymagania:

Aby przechwytywać dźwięk z innej aplikacji, musisz utworzyć obiekt AudioRecord i dodać do niego 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 przechwytywaniem dźwięku

Aplikacja może kontrolować, jakie typy treści może nagrywać i jakie inne aplikacje mogą nagrywać jej odtwarzanie.

Ograniczanie przechwytywania na podstawie treści audio

Aplikacja może ograniczyć zakres nagrywanego dźwięku, korzystając z tych metod:

Pamiętaj, że nie możesz używać jednocześnie metod addMatchingUsage()excludeUsage(). Musisz wybrać jedną z tych opcji. Nie możesz też używać jednocześnie addMatchingUid()excludeUid().

Ograniczanie przechwytywania przez inne aplikacje

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

Wykorzystanie

Odtwarzacz generujący dźwięk musi określić jego użycie jako USAGE_MEDIA, USAGE_GAME lub USAGE_UNKNOWN.

Zasady przechwytywania

Zasady dotyczące przechwytywania odtwarzacza muszą być ustawione na AudioAttributes.ALLOW_CAPTURE_BY_ALL, co umożliwia innym aplikacjom przechwytywanie odtwarzania. Możesz to zrobić na kilka sposobów:

Jeśli te wymagania wstępne są spełnione, można przechwycić dowolny dźwięk odtwarzany przez odtwarzacz.

Wyłączanie przechwytywania systemowego

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

Ustawianie zasad w czasie działania

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

Zasady = manifest + AudioManager + AudioAttributes

Zasady przechwytywania mogą być określone w kilku miejscach, dlatego ważne jest, aby wiedzieć, jak określa się obowiązujące zasady. Zawsze stosowane są najbardziej restrykcyjne zasady dotyczące nagrywania. Na przykład aplikacja, której manifest zawiera uprawnienie setAllowedCapturePolicy="false", nigdy nie zezwoli aplikacjom niesystemowym na przechwytywanie dźwięku, nawet jeśli wartość AudioManager#setAllowedCapturePolicy jest ustawiona na ALLOW_CAPTURE_BY_ALL. Podobnie jeśli zasada AudioManager#setAllowedCapturePolicy ma wartość ALLOW_CAPTURE_BY_ALL, a plik manifestu określa setAllowedCapturePolicy="true", ale elementy AudioAttributes odtwarzacza multimediów zostały utworzone za pomocą AudioAttributes.Builder#setAllowedCapturePolicy(ALLOW_CAPTURE_BY_SYSTEM), to ten odtwarzacz multimediów nie będzie dostępny dla aplikacji systemowych.

Tabela poniżej zawiera podsumowanie wpływu atrybutu pliku manifestu i obowiązujących zasad:

allowAudioPlaybackCapture ALLOW_CAPTURE_BY_ALL ALLOW_CAPTURE_BY_SYSTEM ALLOW_CAPTURE_BY_NONE
true dowolnej aplikacji, tylko system nie przechwycono
fałsz tylko system tylko system nie przechwycono