Nagrywaj filmy i dźwięki

Aplikacja może nagrywać obraz lub dźwięk odtwarzany przez inną aplikację. Takie aplikacje muszą prawidłowo obsługiwać MediaProjection token prawidłowo. 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.

Jak obsługiwać token MediaProjection

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

System wyświetla aktywne tokeny MediaProjection w interfejsie Szybkie ustawienia i umożliwia użytkownikom wycofanie dostępu do tokena w dowolnym momencie. Gdy tak się stanie, wirtualne wyświetlacze lub strumienie audio powiązane z sesją przestaną odbierać strumienie multimediów. Twoja aplikacja musi odpowiednio zareagować, w przeciwnym razie będzie nadal nagrywać ciszę lub czarny strumień wideo.

Aby obsłużyć utratę tokena, zarejestruj wywołanie zwrotne w MediaProjection instancji za pomocą registerCallback metody i zatrzymaj nagrywanie, gdy zostanie wywołana onStop metoda.

Więcej informacji znajdziesz w artykule Rejestrowanie 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 SurfaceView, zapoznaj się z przykładową aplikacją ScreenCapture.

Możesz użyć DevicePolicyManager aby uniemożliwić nagrywanie 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 ćwiczeniu z programowania Zarządzanie urządzeniami z Androidem bez aplikacji pokazujemy, jak zablokować robienie 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 jest odpowiednikiem przechwytywania ekranu, ale w przypadku dźwięku. Głównym przypadkiem użycia są aplikacje do strumieniowania, które chcą przechwytywać 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 przechwytywany.

Tworzenie aplikacji do przechwytywania

Ze względów bezpieczeństwa i prywatności przechwytywanie odtwarzania ma pewne ograniczenia. Aby móc przechwytywać dźwięk, aplikacja musi spełniać te wymagania:

Aby przechwytywać dźwięk z innej aplikacji, Twoja 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 setAudioPlaybackCaptureConfig.

Kontrolowanie przechwytywania dźwięku

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

Ograniczanie przechwytywania według treści audio

Aplikacja może ograniczyć, które dźwięki może przechwytywać, za pomocą tych metod:

Pamiętaj, że nie możesz używać jednocześnie metod addMatchingUsage() i excludeUsage(). Musisz wybrać jedną z nich. Podobnie nie możesz używać jednocześnie metod addMatchingUid() i 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 przechwytywać tylko wtedy, gdy aplikacja spełnia te wymagania:

Wykorzystanie

Odtwarzacz generujący dźwięk musi ustawić jego użycie na USAGE_MEDIA, USAGE_GAME lub USAGE_UNKNOWN.

Zasady przechwytywania

Zasady przechwytywania odtwarzacza muszą mieć wartość AudioAttributes.ALLOW_CAPTURE_BY_ALL, co umożliwia innym aplikacjom przechwytywanie odtwarzania. Można to zrobić na kilka sposobów:

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

Wyłączanie przechwytywania przez system

Opisane powyżej zabezpieczenia umożliwiające przechwytywanie 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. Z tego powodu zalecamy, aby aplikacje zezwalały systemowi na przechwytywanie odtwarzania. W rzadkich przypadkach, gdy nie chcesz, aby system przechwytywał odtwarzanie Twojej aplikacji, ustaw zasady przechwytywania na ALLOW_CAPTURE_BY_NONE.

Ustawianie zasad w czasie działania

Możesz wywołać AudioManager.setAllowedCapturePolicy(), aby zmienić zasady przechwytywania podczas działania aplikacji. Jeśli podczas wywoływania metody odtwarzany jest 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 można określić w kilku miejscach, dlatego ważne jest, aby zrozumieć, jak są one określane. Zawsze stosowane są najbardziej restrykcyjne zasady przechwytywania. Na przykład aplikacja, której manifest zawiera setAllowedCapturePolicy="false", nigdy nie zezwoli aplikacjom spoza systemu na przechwytywanie dźwięku, nawet jeśli AudioManager#setAllowedCapturePolicy jest ustawione na ALLOW_CAPTURE_BY_ALL. Podobnie, jeśli AudioManager#setAllowedCapturePolicy jest ustawione na ALLOW_CAPTURE_BY_ALL i manifest ustawia setAllowedCapturePolicy="true", ale AudioAttributes odtwarzacza multimediów zostały utworzone za pomocą AudioAttributes.Builder#setAllowedCapturePolicy(ALLOW_CAPTURE_BY_SYSTEM), to ten odtwarzacz multimediów nie będzie mógł być przechwytywany przez aplikacje spoza systemu.

W tabeli poniżej podsumowano wpływ atrybutu 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