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
umożliwia aplikacjom pobieranie tokena MediaProjection
, który zapewnia jednorazowy dostęp do treści na ekranie lub dźwięku. System operacyjny Android prosi użytkownika o pozwolenie, zanim przyzna token Twojej aplikacji.
System operacyjny wyświetla aktywne tokeny MediaProjection
w interfejsie Szybkie ustawienia i umożliwia użytkownikom w dowolnym momencie cofnięcie dostępu do tokena. W takiej sytuacji 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 Projekcja 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 dla firm (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
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. Głównym przypadkiem użycia jest przesyłanie strumieniowe aplikacji, 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 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 może kontrolować, jakie typy treści może nagrywać, oraz jakie inne aplikacje mogą nagrywać jej odtwarzanie.
Ograniczenie przechwytywania według treści audio
Aplikacja może ograniczyć dźwięk, który może rejestrować, 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. - Przekaż wartość
AUDIO_USAGE
do AudioPlaybackCaptureConfiguration.excludeUsage(), aby zabronić rejestrowanie tego użycia. Aby określić więcej niż jedno użycie, wywołaj metodę kilka razy. - Przekaż identyfikator UID do metody AudioPlaybackCaptureConfiguration.addMatchingUid(), aby rejestrować tylko aplikacje z określonym identyfikatorem UID. 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 dotyczące przechwytywania
Zasady dotyczące nagrywania przez odtwarzacz muszą być zgodne z AudioAttributes.ALLOW_CAPTURE_BY_ALL
, co pozwala innym aplikacjom na nagrywanie odtwarzania. Możesz 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 te wymagania są spełnione, można rejestrować dźwięk wytwarzany 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 rejestrował odtwarzanie aplikacji, ustaw zasadę rejestrowania 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 zmiany w zasadach zaczęły obowiązywać, musisz zamknąć odtwarzacz lub ścieżkę i ponownie je otworzyć.
Zasady = 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 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 |