Aplikacja może nagrywać film lub dźwięk odtwarzany z innej aplikacji. Takie aplikacje muszą poprawnie 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 oraz jak aplikacja audio może uniemożliwić innym aplikacjom nagrywanie odtwarzanych przez nią treści.
Jak postępować z tokenem MediaProjection
Interfejs API MediaProjection
pozwala aplikacjom na uzyskanie tokena MediaProjection
, który zapewnia jednorazowy dostęp do treści na ekranie 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 w dowolnym momencie cofnięcie dostępu do tokena. W takim przypadku wirtualne wyświetlacze lub strumienie audio powiązane z sesją przestają otrzymywać strumienie multimediów. Aplikacja musi odpowiednio zareagować, w przeciwnym razie będzie nadal rejestrować ciszę lub czarny strumień wideo.
Aby obsłużyć utratę tokena, zarejestruj wywołanie zwrotne w obiekcie MediaProjection
, używając metody registerCallback
, i zatrzymaj nagrywanie po wywołaniu metody onStop
.
Więcej informacji znajdziesz w artykule Wyświetlanie multimediów.
Nagraj film
Aby dowiedzieć się, jak używać interfejsu MediaProjection API do przechwytywania ekranu urządzenia w czasie rzeczywistym i wyświetlania go w interfejsie SurfaceView, zapoznaj się z przykładową aplikacją ScreenCapture.
Aby zapobiec nagrywaniu ekranu, możesz użyć DevicePolicyManager
. W przypadku kont firmowych (Androida dla firm) administrator może wyłączyć zbieranie danych asystenta na profilu służbowym, używając metody setScreenCaptureDisabled.
Z ćwiczenia w Codelabs dowiesz się, jak zarządzać urządzeniami z Androidem bez aplikacji. Dowiesz się z niego, jak zablokować możliwość wykonywania zrzutów ekranu.
Przechwytywanie odtwarzania dźwięku
W Androidzie 10 wprowadzono interfejs AudioPlaybackCapture API. 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. Zasadniczo korzysta się z nich do odtwarzania strumieniowego, które chcą rejestrować dźwięk w grach.
Pamiętaj, że interfejs AudioPlaybackCapture API nie wpływa na opóźnienie aplikacji, której dźwięk jest rejestrowany.
Tworzenie aplikacji do przechwytywania
Ze względów bezpieczeństwa i prywatności nagrywanie odtwarzania wiąże się z pewnymi ograniczeniami. Aby aplikacja mogła rejestrować dźwięk, musi spełniać te wymagania:
- Aplikacja musi mieć uprawnienie
RECORD_AUDIO
. - Aplikacja musi wyświetlić prompt wyświetlany przez
MediaProjectionManager.createScreenCaptureIntent()
, a użytkownik musi go zatwierdzić. - Aplikacje do nagrywania i odtwarzania muszą być na tym samym profilu użytkownika.
Aby rejestrować dźwięk z innej aplikacji, Twoja aplikacja musi utworzyć obiekt AudioRecord
i dodać do niego obiekt AudioPlaybackCaptureConfiguration
. Wykonaj te czynności:
- Zadzwoń pod numer
AudioPlaybackCaptureConfiguration.Builder.build()
, aby utworzyćAudioPlaybackCaptureConfiguration
. - Przekaż konfigurację do
AudioRecord
, wywołując funkcjęsetAudioPlaybackCaptureConfig
.
Sterowanie rejestrowaniem dźwięku
Aplikacja ma kontrolę nad tym, jakie rodzaje treści może nagrywać i jakie inne aplikacje mogą nagrywać swoje odtwarzanie.
Ograniczenie przechwytywania treści audio
Aplikacja może ograniczyć przechwytywanie dźwięku za pomocą tych metod:
- Przekaż wartość
AUDIO_USAGE
do metody AudioPlaybackCaptureConfiguration.addMatchingUsage(), aby zezwolić na rejestrowanie określonego użycia. Aby określić więcej niż jedno użycie, wywołaj metodę kilka razy. - Aby uniemożliwić rejestrowanie tego użycia, przekaż
AUDIO_USAGE
do AudioPlaybackCaptureConfiguration.wyłączUsage(). Aby określić więcej niż jedno użycie, wywołaj metodę kilka razy. - Aby przechwytywać tylko aplikacje z określonym identyfikatorem UID, przekaż identyfikator UID do AudioPlaybackCaptureConfiguration.addMatchingUid(). Aby określić więcej niż 1 identyfikator UID, wywołaj metodę kilka razy.
- Przekaż identyfikator UID do metody AudioPlaybackCaptureConfiguration.excludeUid(), aby zabronić przechwytywania tego identyfikatora. Aby określić więcej niż 1 identyfikator UID, wywołaj metodę kilka razy.
Pamiętaj, że nie możesz używać metod addMatchingUsage()
i excludeUsage()
jednocześnie. Musisz wybrać jeden lub drugi. Podobnie nie możesz używać jednocześnie właściwości addMatchingUid()
i excludeUid()
.
Ograniczenie możliwości przechwytywania przez inne aplikacje
Możesz skonfigurować aplikację, aby uniemożliwić innym aplikacjom rejestrowanie dźwięku. Dźwięk z aplikacji może być rejestrowany tylko wtedy, gdy aplikacja spełnia te wymagania:
Wykorzystanie
Odtwarzacz, który generuje dźwięk, musi ustawić jego użycie na USAGE_MEDIA
,
USAGE_GAME
lub
USAGE_UNKNOWN
.
Zasady przechwytywania
Zasady dotyczące nagrywania przez odtwarzacz muszą być zgodne z AudioAttributes.ALLOW_CAPTURE_BY_ALL
, co pozwala innym aplikacjom na nagrywanie odtwarzania. Można to zrobić na kilka sposobów:
- Aby umożliwić nagrywanie na wszystkich odtwarzaczach, dodaj plik
android:allowAudioPlaybackCapture="true"
do plikumanifest.xml
aplikacji. - Możesz też włączyć nagrywanie na wszystkich odtwarzaczach, dzwoniąc na numer
AudioManager.setAllowedCapturePolicy(AudioAttributes.ALLOW_CAPTURE_BY_ALL)
. - Możesz ustawić zasady dla poszczególnych graczy podczas tworzenia gry za pomocą
AudioAttributes.Builder.setAllowedCapturePolicy(AudioAttributes.ALLOW_CAPTURE_BY_ALL)
. (jeśli korzystasz z usługiAAudio
),AAudioStreamBuilder_setAllowedCapturePolicy(AAUDIO_ALLOW_CAPTURE_BY_ALL)
Jeśli spełniasz te wymagania wstępne, można przechwytywać każdy dźwięk wygenerowany przez odtwarzacz.
Wyłączanie przechwytywania systemu
Opisane powyżej zabezpieczenia umożliwiające rejestrowanie dotyczą tylko aplikacji. Komponenty systemu Android domyślnie mogą rejestrować odtwarzanie.
Wiele z tych komponentów jest dostosowywanych przez dostawców Androida i obsługuje funkcje takie jak ułatwienia dostępu czy napisy. Dlatego zalecamy, aby aplikacje zezwalały systemowi na rejestrowanie odtwarzania. W rzadkich przypadkach, gdy nie chcesz, aby system przechwytywał odtwarzanie aplikacji, ustaw zasadę przechwytywania na ALLOW_CAPTURE_BY_NONE
.
Ustawianie zasad w czasie działania
Aby zmienić politykę przechwytywania podczas działania aplikacji, możesz wywołać funkcję AudioManager.setAllowedCapturePolicy()
. Jeśli w momencie wywołania metody odtwarzany jest MediaPlayer lub AudioTrack, dźwięk nie zostanie zmieniony. Aby zmiana zasady zaczęła obowiązywać, musisz zamknąć i ponownie otworzyć odtwarzacz lub ścieżkę.
Zasady = manifest + AudioManager + AudioAttributes
Ponieważ zasadę przechwytywania można ustawić w kilku miejscach, trzeba zrozumieć, jak jest określana skuteczna zasada.
Zawsze stosuje się najbardziej restrykcyjną zasadę przechwytywania. Na przykład aplikacja, której manifest zawiera wartość setAllowedCapturePolicy="false"
, nigdy nie pozwoli aplikacjom niesystemowym na rejestrowanie dźwięku, nawet jeśli parametr AudioManager#setAllowedCapturePolicy
jest ustawiony na wartość ALLOW_CAPTURE_BY_ALL
. Podobnie, jeśli AudioManager#setAllowedCapturePolicy
ma wartość ALLOW_CAPTURE_BY_ALL
, a plik manifestowy ma wartość setAllowedCapturePolicy="true"
, ale odtwarzacz multimediów AudioAttributes
został utworzony z wartością AudioAttributes.Builder#setAllowedCapturePolicy(ALLOW_CAPTURE_BY_SYSTEM)
, aplikacje inne niż systemowe nie będą mogły go przechwycić.
Tabela poniżej podsumowuje wpływ atrybutu pliku 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 |