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 i jak aplikacja audio może uniemożliwić innym aplikacjom rejestrowanie odtwarzanych treści.
Jak obsługiwać token MediaProjection
Interfejs API MediaProjection
umożliwia aplikacjom uzyskanie tokena MediaProjection
, który daje im jednorazowy dostęp do przechwytywania treści ekranu 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 wycofanie dostępu do tokena w dowolnym momencie. W takiej sytuacji wirtualne wyświetlacze lub strumienie audio powiązane z sesją przestają odbierać strumienie multimedialne. Aplikacja musi zareagować odpowiednio. W przeciwnym razie
będzie nadal nagrywać ciszę audio lub czarny strumień wideo.
Aby poradzić sobie z utratą tokena, zarejestruj wywołanie zwrotne w instancji MediaProjection
przy użyciu 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 używać interfejsu Media Projection API do przechwytywania ekranu urządzenia w czasie rzeczywistym i wyświetlania go w SurfaceView.
DevicePolicyManager
pozwala zapobiec nagrywaniu zawartości ekranu. W przypadku kont firmowych (Android for Work) administrator może wyłączyć zbieranie danych Asystenta w profilu służbowym przy użyciu 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
Interfejs AudioPlaybackCapture API został wprowadzony w Androidzie 10. Ten interfejs API umożliwia aplikacjom kopiowanie dźwięku odtwarzanego przez inne aplikacje. Ta funkcja działa podobnie jak w przypadku przechwytywania ekranu, ale tylko 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 AudioOdtwarzanieCapture API nie wpływa na czas oczekiwania aplikacji, w której jest przechwytywany dźwięk.
Tworzenie aplikacji do przechwytywania
Ze względu na bezpieczeństwo i prywatność nagrywanie odtwarzania ma pewne ograniczenia. Aby można było rejestrować dźwięk, aplikacja 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 przechwytywania i odtwarzania muszą być w tym samym profilu użytkownika.
Aby przechwytywać dźwięk z innej aplikacji, musi ona utworzyć obiekt AudioRecord
i dodać do niego obiekt AudioPlaybackCaptureConfiguration
. Wykonaj te czynności:
- Wywołaj
AudioPlaybackCaptureConfiguration.Builder.build()
, aby utworzyćAudioPlaybackCaptureConfiguration
. - Przekaż konfigurację do
AudioRecord
, wywołując metodęsetAudioPlaybackCaptureConfig
.
Sterowanie nagrywaniem dźwięku
Aplikacja ma kontrolę nad tym, jakie rodzaje treści może nagrywać i jakie inne aplikacje mogą nagrywać swoje odtwarzanie.
Ograniczenie nagrywania według treści audio
Aplikacja może ograniczyć przechwytywanie dźwięku za pomocą tych metod:
- Aby umożliwić przechwytywanie określonego użycia, przekaż
AUDIO_USAGE
do AudioPlaybackCaptureConfiguration.addMatchingUsage(). Wywołaj tę metodę wiele razy, aby określić więcej niż jedno użycie. - Aby uniemożliwić przechwytywanie tego użycia, przekaż
AUDIO_USAGE
do AudioPlaybackCaptureConfiguration.WejdźUsage(). Wywołaj tę metodę wiele razy, aby określić więcej niż jedno użycie. - Aby przechwytywać tylko aplikacje z określonym identyfikatorem UID, przekaż identyfikator UID do AudioPlaybackCaptureConfiguration.addMatchingUid(). Wywołaj tę metodę wiele razy, aby określić więcej niż 1 identyfikator UID.
- Aby uniemożliwić przechwytywanie tego identyfikatora UID, przekaż identyfikator UID do metody AudioPlaybackCaptureConfiguration.wyłączUid(). Wywołaj tę metodę wiele razy, aby określić więcej niż 1 identyfikator UID.
Pamiętaj, że metod addMatchingUsage()
i excludeUsage()
nie można używać jednocześnie. Musisz wybrać jeden lub drugi. Nie możesz jednocześnie używać usług addMatchingUid()
i excludeUid()
.
Ograniczenie przechwytywania przez inne aplikacje
Możesz skonfigurować aplikację tak, by uniemożliwić innym aplikacjom przechwytywanie dźwięku. Dźwięk z aplikacji można przechwytywać tylko wtedy, gdy aplikacja spełnia te wymagania:
Wykorzystanie
Odtwarzacz generujący dźwięk musi ustawić sposób wykorzystania
na USAGE_MEDIA
,
USAGE_GAME
lub
USAGE_UNKNOWN
.
Zasady 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 we wszystkich odtwarzaczach, umieść
android:allowAudioPlaybackCapture="true"
w plikumanifest.xml
aplikacji. - Możesz też włączyć przechwytywanie na wszystkich odtwarzaczach, wywołując metodę
AudioManager.setAllowedCapturePolicy(AudioAttributes.ALLOW_CAPTURE_BY_ALL)
. - Możesz ustawić zasady 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 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, które umożliwiają przechwytywanie danych, mają zastosowanie tylko do aplikacji. Komponenty systemu Android mogą domyślnie rejestrować odtwarzanie.
Wiele z tych komponentów jest dostosowywanych przez dostawców Androida i obsługuje takie funkcje jak ułatwienia dostępu i napisy. Z tego względu zalecamy, aby aplikacje
umożliwiały systemowi przechwytywanie 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
Możesz wywołać AudioManager.setAllowedCapturePolicy()
, aby zmienić zasadę przechwytywania podczas działania aplikacji. Jeśli w momencie wywołania tej metody odtwarza się MediaPlayer lub AudioTrack, dźwięk pozostaje bez zmian. Aby zmiana zasady została zastosowana, musisz zamknąć i ponownie otworzyć odtwarzacz lub ścieżkę.
Zasada = manifest + AudioManager + AudioAttributes
Ponieważ zasadę przechwytywania można ustawić w kilku miejscach, trzeba zrozumieć, jak jest określana skuteczna zasada.
Zawsze stosowana jest najbardziej restrykcyjna zasada przechwytywania. Na przykład aplikacja, w której w manifeście zawiera właściwość setAllowedCapturePolicy="false"
, nigdy nie zezwala aplikacjom niesystemowym na przechwytywanie dźwięku, nawet jeśli AudioManager#setAllowedCapturePolicy
ma wartość ALLOW_CAPTURE_BY_ALL
. I podobnie, jeśli AudioManager#setAllowedCapturePolicy
ma wartość ALLOW_CAPTURE_BY_ALL
, a w manifeście ustawiona jest wartość setAllowedCapturePolicy="true"
, ale odtwarzacz AudioAttributes
został skompilowany za pomocą AudioAttributes.Builder#setAllowedCapturePolicy(ALLOW_CAPTURE_BY_SYSTEM)
, aplikacje inne niż systemowe nie obsługują tego odtwarzacza.
W tabeli poniżej znajdziesz podsumowanie wpływu atrybutu pliku manifestu i obowiązującej zasady:
zezwalaj na odtwarzanie dźwięku na przechwytywanie dźwięku | ALLOW_CAPTURE_BY_ALL | ALLOW_CAPTURE_BY_SYSTEM | ALLOW_CAPTURE_BY_NONE |
---|---|---|---|
true | dowolna aplikacja | tylko system | brak przechwytywania |
false | tylko system | tylko system | brak przechwytywania |