Aplikacja może nagrywać obraz lub dźwięk odtwarzany przez inną aplikację. Takie aplikacje muszą prawidłowo 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 nagrywanie odtwarzanych przez nią treści.
Jak postępować z tokenem MediaProjection
Interfejs API MediaProjection umożliwia aplikacjom uzyskanie tokena MediaProjection, który daje im jednorazowy dostęp do przechwytywania zawartości ekranu lub dźwięku. System operacyjny Android prosi użytkownika o zgodę, zanim przyzna token 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 takim przypadku wyświetlacze wirtualne lub strumienie audio powiązane z sesją przestają odbierać strumienie multimediów. Aplikacja musi odpowiednio zareagować, w przeciwnym razie będzie nadal nagrywać ciszę lub czarny obraz.
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 Media projection (Projekcja multimediów).
Nagraj film
Aby uniemożliwić nagrywanie ekranu, możesz użyć DevicePolicyManager. W przypadku kont służbowych (Android for Work) administrator może wyłączyć zbieranie danych asystenta na profilu służbowym, używając metody setScreenCaptureDisabled.
Ćwiczenie z programowania Zarządzanie urządzeniami z Androidem bez aplikacji pokazuje, jak zabronić robienia zrzutów ekranu.
Przechwytywanie odtwarzanego 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 dotyczy dźwięku. Głównym przypadkiem użycia są aplikacje do odtwarzania strumieniowego, które chcą przechwytywać dźwięk odtwarzany przez gry.
Pamiętaj, że interfejs AudioPlaybackCapture API nie wpływa na czas oczekiwania aplikacji, 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 nagrywać dźwięk, musi spełniać te wymagania:
- Aplikacja musi mieć uprawnienie
RECORD_AUDIO. - Aplikacja musi wyświetlić prośbę o potwierdzenie przez
MediaProjectionManager.createScreenCaptureIntent(), a użytkownik musi ją zatwierdzić. - Aplikacje do nagrywania i odtwarzania muszą znajdować się w tym samym profilu użytkownika.
Aby przechwytywać dźwięk z innej aplikacji, Twoja aplikacja musi utworzyć obiekt AudioRecord i dodać do niego AudioPlaybackCaptureConfiguration. Wykonaj te czynności:
- Wywołaj
AudioPlaybackCaptureConfiguration.Builder.build(), aby utworzyćAudioPlaybackCaptureConfiguration. - Przekaż konfigurację do
AudioRecord, wywołującsetAudioPlaybackCaptureConfig.
Kontrolowanie przechwytywania dźwięku
Twoja aplikacja może kontrolować, jakie typy treści może nagrywać i jakie inne rodzaje aplikacji mogą nagrywać jej odtwarzanie.
Ograniczanie przechwytywania według treści audio
Aplikacja może ograniczyć nagrywanie dźwięku za pomocą tych metod:
- Przekaż
AUDIO_USAGEdo AudioPlaybackCaptureConfiguration.Builder.addMatchingUsage(), aby zezwolić na przechwytywanie określonego zastosowania. Wywołaj metodę kilka razy, aby określić więcej niż jedno zastosowanie. - Przekaż
AUDIO_USAGEdo metody AudioPlaybackCaptureConfiguration.excludeUsage(), aby zabronić przechwytywania tego zastosowania. Aby określić więcej niż jedno zastosowanie, wywołaj metodę kilka razy. - Przekaż identyfikator UID do metody AudioPlaybackCaptureConfiguration.addMatchingUid(), aby przechwytywać tylko aplikacje o określonym identyfikatorze UID. Wywołaj metodę kilka razy, aby określić więcej niż 1 identyfikator UID.
- Przekaż identyfikator UID do metody AudioPlaybackCaptureConfiguration.excludeUid(), aby zabronić przechwytywania tego identyfikatora. Aby określić więcej niż 1 identyfikator UID, wywołaj tę metodę kilka razy.
Pamiętaj, że nie możesz używać metod addMatchingUsage() i excludeUsage() jednocześnie. 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 nagrywać tylko wtedy, gdy aplikacja spełnia te wymagania:
Wykorzystanie
Odtwarzacz generujący dźwięk musi ustawić jego wykorzystanie na USAGE_MEDIA, USAGE_GAME lub USAGE_UNKNOWN.
Zasada przechwytywania
Zasady przechwytywania odtwarzacza muszą mieć wartość AudioAttributes.ALLOW_CAPTURE_BY_ALL, która 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 na wszystkich odtwarzaczach, wywołując funkcję
AudioManager.setAllowedCapturePolicy(AudioAttributes.ALLOW_CAPTURE_BY_ALL). - Zasady możesz ustawić na poziomie poszczególnych odtwarzaczy, gdy tworzysz je za pomocą
AudioAttributes.Builder.setAllowedCapturePolicy(AudioAttributes.ALLOW_CAPTURE_BY_ALL). (Jeśli używaszAAudio, wywołajAAudioStreamBuilder_setAllowedCapturePolicy(AAUDIO_ALLOW_CAPTURE_BY_ALL)).
Jeśli te wymagania wstępne są spełnione, można przechwytywać dowolny dźwięk odtwarzany przez odtwarzacz.
Wyłączanie przechwytywania systemu
Opisane powyżej zabezpieczenia zezwalające na przechwytywanie dotyczą tylko aplikacji. Komponenty systemu Android mogą domyślnie rejestrować 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 w 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, gdy aplikacja jest uruchomiona. Jeśli podczas wywoływania metody odtwarzany jest MediaPlayer lub AudioTrack, nie ma to wpływu na dźwięk. Aby zmiany zasad zaczęły obowiązywać, musisz zamknąć i ponownie otworzyć odtwarzacz lub ścieżkę.
Zasada = manifest + AudioManager + AudioAttributes
Zasady przechwytywania można określić w kilku miejscach, dlatego ważne jest, aby zrozumieć, jak są określane obowiązujące zasady.
Zawsze stosowana jest najbardziej restrykcyjna zasada przechwytywania. Na przykład aplikacja, której plik manifestu zawiera setAllowedCapturePolicy="false", nigdy nie zezwoli aplikacjom niesystemowym na przechwytywanie dźwięku, nawet jeśli parametr AudioManager#setAllowedCapturePolicy jest ustawiony na ALLOW_CAPTURE_BY_ALL. Podobnie, jeśli zasada AudioManager#setAllowedCapturePolicy ma wartość ALLOW_CAPTURE_BY_ALL, a plik manifestu ma ustawioną wartość setAllowedCapturePolicy="true", ale AudioAttributes odtwarzacza multimedialnego zostały utworzone za pomocą AudioAttributes.Builder#setAllowedCapturePolicy(ALLOW_CAPTURE_BY_SYSTEM), aplikacje niesystemowe nie będą mogły przechwytywać tego odtwarzacza multimedialnego.
Tabela poniżej zawiera podsumowanie wpływu atrybutu manifestu i obowiązującej zasady:
| allowAudioPlaybackCapture | ALLOW_CAPTURE_BY_ALL | ALLOW_CAPTURE_BY_SYSTEM | ALLOW_CAPTURE_BY_NONE |
|---|---|---|---|
| prawda | dowolna aplikacja | tylko system | bez przechwytywania |
| fałsz | tylko system | tylko system | bez przechwytywania |