Aplikacja może nagrywać obraz lub dźwięk odtwarzany z innej aplikacji. Takie aplikacje muszą prawidłowo obsługiwać token MediaProjection
. Z tej strony dowiesz się, jak to zrobić. Przewodnik pokazuje też, jak administrator urządzenia może wyłączyć możliwość zapisywania zrzutów ekranu oraz jak aplikacja audio może uniemożliwić innym aplikacjom rejestrowanie odtwarzanych treści.
Jak obsługiwać token MediaProjection
Interfejs API MediaProjection
pozwala aplikacjom uzyskać token MediaProjection
, który daje im jednorazowy dostęp do przechwytywania zawartości ekranu i dźwięku. System operacyjny Android prosi użytkownika o uprawnienia przed przyznaniem tokena aplikacji.
System operacyjny wyświetla aktywne tokeny MediaProjection
w Szybkich ustawieniach i umożliwia użytkownikom wycofanie dostępu do tokena w dowolnym momencie. W takiej sytuacji wirtualne wyświetlacze lub strumienie audio powiązane z sesją przestaną otrzymywać strumienie multimediów. Aplikacja musi zareagować odpowiednio. W przeciwnym razie nadal będzie
nagrywać ciszę dźwiękową lub czarny strumień wideo.
Aby zapobiec utracie tokena, zarejestruj wywołanie zwrotne w instancji MediaProjection
za pomocą metody registerCallback
i zatrzymaj rejestrowanie po wywołaniu metody onStop
.
Więcej informacji znajdziesz w artykule Wyświetlanie multimediów.
Nagraj film
Zapoznaj się z przykładową aplikacją ScreenCapture, aby dowiedzieć się, jak za pomocą interfejsu Media Projection API rejestrować zawartość ekranu urządzenia w czasie rzeczywistym i wyświetlać go w SurfaceView.
Aby uniemożliwić rejestrowanie zawartości ekranu, możesz użyć: DevicePolicyManager
. Na kontach firmowych (Android for Work) administrator może wyłączyć zbieranie danych asystenta na profilu służbowym przy użyciu metody setScreenCaptureDisabled.
Ćwiczenie z programowania Zarządzanie urządzeniami z Androidem bez aplikacji pokazuje, jak blokować zrzuty ekranu.
Nagraj dźwięk podczas odtwarzania
Interfejs AudioOdtwarzanieCapture API został wprowadzony w Androidzie 10. Umożliwia on aplikacjom kopiowanie dźwięku odtwarzanego przez inne aplikacje. Ta funkcja działa analogicznie do zrzutów ekranu, ale z dźwiękiem. Główny przypadek użycia to aplikacje do strumieniowego przesyłania danych, które chcą rejestrować dźwięk odtwarzany w grach.
Pamiętaj, że interfejs AudioPlaybackCapture API nie ma wpływu na opóźnienie aplikacji, której dźwięk jest rejestrowany.
Tworzenie aplikacji do przechwytywania
Ze względów bezpieczeństwa i ochrony prywatności funkcja przechwytywania odtwarzania nakłada pewne ograniczenia. Aby móc rejestrować dźwięk, aplikacja musi spełniać te wymagania:
- Aplikacja musi mieć uprawnienie
RECORD_AUDIO
. - Aplikacja musi wywołać prompt wyświetlany przez
MediaProjectionManager.createScreenCaptureIntent()
, a użytkownik musi go zatwierdzić. - Aplikacje do nagrywania i odtwarzania muszą znajdować się w tym samym profilu użytkownika.
Aby przechwytywać dźwięk z innej aplikacji, 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ąc metodęsetAudioPlaybackCaptureConfig
.
Sterowanie rejestrowaniem dźwięku
Aplikacja może kontrolować, jakie typy treści może nagrywać oraz jakie inne aplikacje mogą nagrywać własne odtwarzanie.
Ograniczanie nagrywania przez treści audio
Aplikacja może ograniczyć rejestrowanie dźwięku, korzystając z tych metod:
- Przekaż
AUDIO_USAGE
do AudioPlaybackCaptureConfiguration.addMatchingUsage(), aby umożliwić rejestrowanie określonego użycia. Wywołaj tę metodę kilka razy, aby określić więcej niż jedno użycie. - Aby uniemożliwić rejestrowanie tego użycia, przekaż parametr
AUDIO_USAGE
do AudioPlaybackCaptureConfiguration.exceptUsage(). Wywołaj tę metodę kilka razy, aby określić więcej niż jedno użycie. - Przekaż identyfikator UID do funkcji AudioPlaybackCaptureConfiguration.addMatchingUid(), aby przechwytywać tylko aplikacje z określonym identyfikatorem UID. Aby określić więcej niż 1 identyfikator UID, wywołaj metodę kilka razy.
- Aby uniemożliwić przechwytywanie tego identyfikatora UID, należy przekazać identyfikator UID do metody AudioPlaybackCaptureConfiguration.exceptUid(). Aby określić więcej niż 1 identyfikator UID, wywołaj metodę kilka razy.
Pamiętaj, że nie możesz używać jednocześnie metod addMatchingUsage()
i excludeUsage()
. Musisz wybrać jeden lub drugi. Nie możesz też używać jednocześnie addMatchingUid()
i excludeUid()
.
Ograniczanie przechwytywania przez inne aplikacje
Możesz tak skonfigurować aplikację, by uniemożliwić innym aplikacjom rejestrowanie dźwięku z jej otoczenia. Dźwięk z aplikacji można przechwytywać tylko wtedy, gdy spełnia ona te wymagania:
Wykorzystanie
Odtwarzacz, który tworzy dźwięk, musi ustawić jego użycie na USAGE_MEDIA
, USAGE_GAME
lub USAGE_UNKNOWN
.
Zasada przechwytywania
Zasadą przechwytywania w odtwarzaczu musi być AudioAttributes.ALLOW_CAPTURE_BY_ALL
, która zezwala innym aplikacjom na nagrywanie odtwarzania. Można to zrobić na kilka sposobów:
- Aby umożliwić przechwytywanie we wszystkich odtwarzaczach, umieść
android:allowAudioPlaybackCapture="true"
w plikumanifest.xml
aplikacji. - Aby włączyć przechwytywanie we wszystkich odtwarzaczach, możesz też wywołać metodę
AudioManager.setAllowedCapturePolicy(AudioAttributes.ALLOW_CAPTURE_BY_ALL)
. - Zasady możesz ustawić dla konkretnego gracza podczas jego tworzenia 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 warunki zostaną spełnione, każdy dźwięk wygenerowany przez odtwarzacz będzie mógł zostać przechwycony.
Wyłączam przechwytywanie systemu
Opisane powyżej zabezpieczenia umożliwiające przechwytywanie dotyczą tylko aplikacji. Komponenty systemu Android
domyślnie przechwytują odtwarzanie.
Wiele z nich jest dostosowanych przez dostawców Androida i obsługuje takie funkcje jak ułatwienia dostępu i napisy. Dlatego zalecamy, aby aplikacje umożliwiały systemowi
rejestrowanie treści 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
Wywołanie metody AudioManager.setAllowedCapturePolicy()
umożliwia zmianę zasady przechwytywania ruchu, gdy aplikacja jest uruchomiona. Wywołanie tej metody nie wpływa na dźwięk, jeśli odtwarzacz MediaPlayer lub AudioTrack
jest odtwarzany. Aby zmiana zasady zaczęła obowiązywać, musisz zamknąć i ponownie otworzyć odtwarzacz lub ścieżkę.
Zasada = manifest + AudioManager + AudioAttributes
Zasadę przechwytywania można określić w kilku miejscach, dlatego ważne jest, aby wiedzieć, jak określa się jej skuteczność.
Zawsze stosowana jest najbardziej restrykcyjna zasada przechwytywania. Na przykład aplikacja, której manifest zawiera właściwość setAllowedCapturePolicy="false"
, nigdy nie zezwoli aplikacjom niesystemowym na rejestrowanie dźwięku nawet wtedy, gdy zasada AudioManager#setAllowedCapturePolicy
ma wartość ALLOW_CAPTURE_BY_ALL
. I podobnie, jeśli AudioManager#setAllowedCapturePolicy
ma wartość ALLOW_CAPTURE_BY_ALL
, a plik manifestu zawiera setAllowedCapturePolicy="true"
, a plik AudioAttributes
odtwarzacza multimediów został utworzony za pomocą AudioAttributes.Builder#setAllowedCapturePolicy(ALLOW_CAPTURE_BY_SYSTEM)
, to odtwarzacz nie obsługuje aplikacji innych niż systemowe.
Tabela poniżej zawiera podsumowanie wpływu atrybutu manifestu i obowiązujących zasad:
allowAudioOdtwarzanieCapture | ALLOW_CAPTURE_BY_WSZYSTKO | ALLOW_CAPTURE_BY_SYSTEM | ALLOW_CAPTURE_BY_NONE |
---|---|---|---|
true | dowolna aplikacja | tylko system | brak zapisu |
false | tylko system | tylko system | brak zapisu |