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.
Jak postępować 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 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 multimediów. Aplikacja musi odpowiednio reagować na to zdarzenie, w przeciwnym razie będzie nadal rejestrować ciszę lub czarny strumień wideo.
Aby obsłużyć 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 Rejestrowanie multimediów.
Nagraj film
Aby zapobiec nagrywaniu ekranu, możesz użyć DevicePolicyManager. W przypadku kont firmowych (Android for Work) administrator może wyłączyć zbieranie danych asystenta w profilu służbowym za pomocą metody setScreenCaptureDisabled.
Ćwiczenie Zarządzanie urządzeniami z Androidem bez aplikacji pokazuje, jak zabronić robienia zrzutów ekranu.
Nagrywanie odtwarzanego 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 przechwytywanie dźwięku z gier przez aplikacje do strumieniowania.
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 podlega pewnym ograniczeniom. Aby aplikacja mogła rejestrować dźwięk, musi spełniać te wymagania:
- Aplikacja musi mieć uprawnienie
RECORD_AUDIO. - Aplikacja musi wyświetlać prompta wyświetlanego przez
MediaProjectionManager.createScreenCaptureIntent(), a użytkownik musi go zatwierdzić. - Aplikacje do nagrywania i odtwarzania muszą znajdować się w tym samym profilu użytkownika.
Aby przechwytywać dźwięk z innej aplikacji, musisz utworzyć obiekt AudioRecord i dodać do niego AudioPlaybackCaptureConfiguration. Wykonaj te czynności:
- Zadzwoń pod numer
AudioPlaybackCaptureConfiguration.Builder.build(), aby stworzyćAudioPlaybackCaptureConfiguration. - 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ć i jakie inne aplikacje mogą nagrywać jej odtwarzanie.
Ograniczanie rejestrowania na podstawie treści audio
Aplikacja może ograniczyć zakres przechwytywanego dźwięku, korzystając z tych metod:
- Przekaż
AUDIO_USAGEdo AudioPlaybackCaptureConfiguration.Builder.addMatchingUsage() , aby zezwolić na przechwytywanie w określonym przypadku użycia. Wywołaj metodę kilka razy, aby określić więcej niż jedno zastosowanie. - Przekaż obiekt
AUDIO_USAGEdo metody AudioPlaybackCaptureConfiguration.excludeUsage(), aby zabronić przechwytywania tego rodzaju użycia. Wywołaj metodę kilka razy, aby określić więcej niż jedno zastosowanie. - Przekaż identyfikator UID do funkcji AudioPlaybackCaptureConfiguration.addMatchingUid(), aby przechwytywać tylko aplikacje z określonym identyfikatorem UID. Wywołaj tę metodę kilka razy, aby określić więcej niż jeden identyfikator UID.
- Przekaż identyfikator UID do funkcji AudioPlaybackCaptureConfiguration.excludeUid(), aby zabronić przechwytywania tego identyfikatora. Wywołaj tę metodę kilka razy, aby określić więcej niż jeden identyfikator UID.
Pamiętaj, że nie możesz używać jednocześnie metod addMatchingUsage() i excludeUsage(). Musisz wybrać jedną z tych opcji. Nie możesz też używać jednocześnie 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 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 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:
- Aby włączyć przechwytywanie na wszystkich odtwarzaczach, dodaj
android:allowAudioPlaybackCapture="true"do plikumanifest.xmlaplikacji. - Możesz też włączyć przechwytywanie u wszystkich graczy, wywołując funkcję
AudioManager.setAllowedCapturePolicy(AudioAttributes.ALLOW_CAPTURE_BY_ALL). - Zasady możesz ustawić w przypadku poszczególnych odtwarzaczy, gdy tworzysz je za pomocą
AudioAttributes.Builder.setAllowedCapturePolicy(AudioAttributes.ALLOW_CAPTURE_BY_ALL). (Jeśli używasz połączeniaAAudioAAudioStreamBuilder_setAllowedCapturePolicy(AAUDIO_ALLOW_CAPTURE_BY_ALL)).
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 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 umożliwiały systemowi rejestrowanie odtwarzania. W rzadkich przypadkach, gdy nie chcesz, aby system rejestrował odtwarzanie w Twojej 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 można określić w kilku miejscach, dlatego ważne jest, aby wiedzieć, jak są one wyznaczane.
Zawsze stosowane są najbardziej restrykcyjne zasady dotyczące rejestrowania. Na przykład aplikacja, której manifest zawiera uprawnienie setAllowedCapturePolicy="false", nigdy nie zezwoli aplikacjom niesystemowym na przechwytywanie dźwięku, nawet jeśli atrybut AudioManager#setAllowedCapturePolicy ma wartość 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 z użyciem AudioAttributes.Builder#setAllowedCapturePolicy(ALLOW_CAPTURE_BY_SYSTEM), to odtwarzacz multimediów nie będzie mógł być przechwytywany przez aplikacje inne niż systemowe.
W tabeli poniżej znajdziesz podsumowanie wpływu atrybutu pliku manifestu i obowiązujących zasad:
| allowAudioPlaybackCapture | ALLOW_CAPTURE_BY_ALL | ALLOW_CAPTURE_BY_SYSTEM | ALLOW_CAPTURE_BY_NONE |
|---|---|---|---|
| prawda | dowolnej aplikacji, | tylko system | nie rejestruje, |
| fałsz | tylko system | tylko system | nie rejestruje, |