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 zrzutu 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ść funkcja powtórki ma pewne ograniczenia. 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 zgodę wygenerowaną przez
MediaProjectionManager.createScreenCaptureIntent(), a użytkownik musi ją zaakceptować. - Aplikacje do przechwytywania 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.
Sterowanie przechwytywaniem dźwięku
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. Aby określić więcej niż jedno zastosowanie, wywołaj metodę kilka razy. - Przekaż
AUDIO_USAGEdo 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ć dźwięk tylko z aplikacji o określonym identyfikatorze UID. Aby określić więcej niż 1 identyfikator UID, wywołaj tę metodę wielokrotnie.
- Przekaż identyfikator UID do metody AudioPlaybackCaptureConfiguration.excludeUid(), aby uniemożliwić przechwytywanie tego identyfikatora. Aby określić więcej niż 1 identyfikator UID, wywołaj tę metodę wielokrotnie.
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 przechwycić 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ą być ustawione na 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 we wszystkich odtwarzaczach, wywołując funkcję
AudioManager.setAllowedCapturePolicy(AudioAttributes.ALLOW_CAPTURE_BY_ALL). - Zasady możesz ustawić dla 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 aplikacji, ustaw zasadę przechwytywania na ALLOW_CAPTURE_BY_NONE.
Ustawianie zasady w czasie działania
Możesz wywołać AudioManager.setAllowedCapturePolicy(), aby zmienić zasadę przechwytywania podczas działania aplikacji. Jeśli podczas wywoływania metody MediaPlayer lub AudioTrack odtwarza dźwięk, 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 ustalane są 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 w pliku manifestu ustawiono 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.
Tabela poniżej podsumowuje efekt 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 | brak przechwytywania |
| fałsz | tylko system | tylko system | brak przechwytywania |