Aplikacja może nagrywać film lub dźwięk odtwarzany z innej aplikacji. Takie aplikacje muszą poprawnie obsługiwać token MediaProjection
. Na tej stronie znajdziesz instrukcje. 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 obsługiwać token 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 podanie
przed przyznaniem tokena aplikacji.
System operacyjny wyświetli aktywne tokeny MediaProjection
w interfejsie Szybkich ustawień oraz
umożliwia użytkownikom wycofanie dostępu do tokena w dowolnym momencie. W takim przypadku
wirtualne wyświetlacze lub strumienie audio powiązane z sesją przestają odbierać
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
Zobacz Przykładowa aplikacja ScreenCapture za pomocą interfejsu Media Projection API do rejestrowania w czasie rzeczywistym i prezentować je w SurfaceView.
DevicePolicyManager
aby zapobiec nagrywaniu ekranu. 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.
W laboratorium kodu Zarządzanie urządzeniami z Androidem bez użycia aplikacji znajdziesz informacje o tym, jak zablokować możliwość wykonywania 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łówne zastosowanie to aplikacje do strumieniowego przesyłania danych, które chcą rejestrować 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 rejestrowany.
Tworzenie aplikacji do przechwytywania
Ze względów bezpieczeństwa i prywatności nagrywanie odtwarzania wiąże się z pewnymi ograniczeniami. Aby można było rejestrować dźwięk, aplikacja musi spełniać te wymagania:
- Aplikacja musi mieć
RECORD_AUDIO
uprawnienia. - Aplikacja musi wyświetlić prompt wyświetlany przez
MediaProjectionManager.createScreenCaptureIntent()
a użytkownik musi je zatwierdzić. - Aplikacje do nagrywania i odtwarzania muszą być na tym samym profilu użytkownika.
Aby rejestrować dźwięk z innej aplikacji, musi ona utworzyć
AudioRecord
obiekt
i dodaj
AudioPlaybackCaptureConfiguration
. Wykonaj te czynności:
- Zadzwoń pod numer
AudioPlaybackCaptureConfiguration.Builder.build()
aby stworzyćAudioPlaybackCaptureConfiguration
- Przekaż konfigurację do
AudioRecord
, wywołującsetAudioPlaybackCaptureConfig
Sterowanie rejestrowaniem dźwięku
Aplikacja może określać, jakie typy treści może nagrywać, a także jakie inne aplikacje mogą nagrywać jej odtwarzanie.
Ograniczenie nagrywania według treści audio
Aplikacja może ograniczyć przechwytywanie dźwięku za pomocą metody:
- Przekaż
AUDIO_USAGE
do AudioOdtwarzanieCaptureConfiguration.addMatchingUsage() co pozwala rejestrować konkretne zastosowania. Aby określić więcej niż jedno użycie, wywołaj metodę kilka razy. - Przekaż
AUDIO_USAGE
do AudioPlaybackCaptureConfiguration.wyłączUsage(), aby zakazu rejestrowania tego użycia. Wywołaj tę metodę wiele razy, aby określić więcej niż jedno użycie. - Przekazując identyfikator UID do metody AudioPlaybackCaptureConfiguration.addMatchingUid() aby przechwytywać tylko aplikacje z określonym UID. Wywołaj tę metodę wiele razy, aby określić więcej niż 1 identyfikator UID.
- Przekaż identyfikator UID do metody AudioPlaybackCaptureConfiguration.excludeUid(), aby zabronić przechwytywania tego identyfikatora. Wywołaj tę metodę wiele razy, aby określić więcej niż 1 identyfikator UID.
Pamiętaj, że nie możesz używać metod addMatchingUsage()
i excludeUsage()
jednocześnie. Musisz wybrać jeden lub drugi. Podobnie nie możesz korzystać z usług addMatchingUid()
i excludeUid()
z powrotem.
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żna przechwytywać 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ć ustawione na 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ć przechwytywanie obrazu u wszystkich graczy, dzwoniąc
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 zAAudio
).
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 i 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ć zapis, możesz zadzwonić pod numer AudioManager.setAllowedCapturePolicy()
zasady podczas działania aplikacji. Jeśli w momencie wywołania metody odtwarzany jest MediaPlayer lub AudioTrack, dźwięk nie zostanie zmieniony. Musisz zamknąć i ponownie otworzyć
odtwarzacz lub śledzić, aby zmiana zasad zaczęła obowiązywać.
Zasada = manifest + AudioManager + AudioAttributes
Ponieważ zasadę przechwytywania można określić w kilku miejscach, ważne jest, aby wiedzieć, jak określana jest obowiązująca zasada.
Zawsze stosowana jest najbardziej restrykcyjna zasada przechwytywania. Na przykład w przypadku aplikacji, której
Plik manifestu zawiera plik setAllowedCapturePolicy="false"
, który nigdy nie zezwala na elementy inne niż system
aplikacji rejestrujących dźwięk, nawet jeśli skonfigurowano ustawienie AudioManager#setAllowedCapturePolicy
do: ALLOW_CAPTURE_BY_ALL
. Podobnie, jeśli
AudioManager#setAllowedCapturePolicy
ma wartość ALLOW_CAPTURE_BY_ALL
, a
w pliku manifestu ustawiany jest parametr setAllowedCapturePolicy="true"
, ale typ w odtwarzaczu
AudioAttributes
zostały utworzone za pomocą
AudioAttributes.Builder#setAllowedCapturePolicy(ALLOW_CAPTURE_BY_SYSTEM)
, a potem
tego odtwarzacza nie obsługują aplikacje inne niż systemowe.
W tabeli poniżej przedstawiono efekty działania atrybutu pliku manifestu oraz atrybutu obowiązująca polityka:
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 |