Nagrywaj filmy i dźwięki

Aplikacja może nagrywać obraz lub dźwięk odtwarzany z innej aplikacji. Takie aplikacje muszą prawidłowo obsługiwać token MediaProjection. Z tej strony dowiesz się, jak to zrobić. Przewodnik pokazuje też, jak administrator urządzenia może wyłączyć możliwość zapisywania zrzutów ekranu oraz jak aplikacja audio może uniemożliwić innym aplikacjom rejestrowanie odtwarzanych treści.

Jak obsługiwać token MediaProjection

Interfejs API MediaProjection pozwala aplikacjom uzyskać token MediaProjection, który daje im jednorazowy dostęp do przechwytywania zawartości ekranu i dźwięku. System operacyjny Android prosi użytkownika o uprawnienia przed przyznaniem tokena aplikacji.

System operacyjny wyświetla aktywne tokeny MediaProjection w Szybkich ustawieniach 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ą przestaną otrzymywać strumienie multimediów. Aplikacja musi zareagować odpowiednio. W przeciwnym razie nadal będzie nagrywać ciszę dźwiękową lub czarny strumień wideo.

Aby zapobiec utracie tokena, zarejestruj wywołanie zwrotne w instancji MediaProjection za pomocą 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 za pomocą interfejsu Media Projection API rejestrować zawartość ekranu urządzenia w czasie rzeczywistym i wyświetlać go w SurfaceView.

Aby uniemożliwić rejestrowanie zawartości ekranu, możesz użyć: DevicePolicyManager. Na kontach firmowych (Android for Work) administrator może wyłączyć zbieranie danych asystenta na profilu służbowym przy użyciu metody setScreenCaptureDisabled.

Ćwiczenie z programowania Zarządzanie urządzeniami z Androidem bez aplikacji pokazuje, jak blokować zrzuty ekranu.

Nagraj dźwięk podczas odtwarzania

Interfejs AudioOdtwarzanieCapture API został wprowadzony w Androidzie 10. Umożliwia on aplikacjom kopiowanie dźwięku odtwarzanego przez inne aplikacje. Ta funkcja działa analogicznie do zrzutów ekranu, ale z dźwiękiem. Główny przypadek użycia to aplikacje do strumieniowego przesyłania danych, które chcą rejestrować dźwięk odtwarzany w grach.

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

Tworzenie aplikacji do przechwytywania

Ze względów bezpieczeństwa i ochrony prywatności funkcja przechwytywania odtwarzania nakłada pewne ograniczenia. Aby móc rejestrować dźwięk, aplikacja musi spełniać te wymagania:

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

Aplikacja może kontrolować, jakie typy treści może nagrywać oraz jakie inne aplikacje mogą nagrywać własne odtwarzanie.

Ograniczanie nagrywania przez treści audio

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

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

Ograniczanie przechwytywania przez inne aplikacje

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

Wykorzystanie

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

Zasada przechwytywania

Zasadą przechwytywania w odtwarzaczu musi być AudioAttributes.ALLOW_CAPTURE_BY_ALL, która zezwala innym aplikacjom na nagrywanie odtwarzania. Można to zrobić na kilka sposobów:

Jeśli te warunki zostaną spełnione, każdy dźwięk wygenerowany przez odtwarzacz będzie mógł zostać przechwycony.

Wyłączam przechwytywanie systemu

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

Ustawianie zasady w czasie działania

Wywołanie metody AudioManager.setAllowedCapturePolicy() umożliwia zmianę zasady przechwytywania ruchu, gdy aplikacja jest uruchomiona. Wywołanie tej metody nie wpływa na dźwięk, jeśli odtwarzacz MediaPlayer lub AudioTrack jest odtwarzany. Aby zmiana zasady zaczęła obowiązywać, musisz zamknąć i ponownie otworzyć odtwarzacz lub ścieżkę.

Zasada = manifest + AudioManager + AudioAttributes

Zasadę przechwytywania można określić w kilku miejscach, dlatego ważne jest, aby wiedzieć, jak określa się jej skuteczność. Zawsze stosowana jest najbardziej restrykcyjna zasada przechwytywania. Na przykład aplikacja, której manifest zawiera właściwość setAllowedCapturePolicy="false", nigdy nie zezwoli aplikacjom niesystemowym na rejestrowanie dźwięku nawet wtedy, gdy zasada AudioManager#setAllowedCapturePolicy ma wartość ALLOW_CAPTURE_BY_ALL. I podobnie, jeśli AudioManager#setAllowedCapturePolicy ma wartość ALLOW_CAPTURE_BY_ALL, a plik manifestu zawiera setAllowedCapturePolicy="true", a plik AudioAttributes odtwarzacza multimediów został utworzony za pomocą AudioAttributes.Builder#setAllowedCapturePolicy(ALLOW_CAPTURE_BY_SYSTEM), to odtwarzacz nie obsługuje aplikacji innych niż systemowe.

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

allowAudioOdtwarzanieCapture ALLOW_CAPTURE_BY_WSZYSTKO ALLOW_CAPTURE_BY_SYSTEM ALLOW_CAPTURE_BY_NONE
true dowolna aplikacja tylko system brak zapisu
false tylko system tylko system brak zapisu