Aplikacja może nagrywać wideo lub dźwięk odtwarzany z innej aplikacji. Takie aplikacje muszą prawidłowo obsługiwać token MediaProjection
. Na tej stronie dowiesz się, jak to zrobić. Wyjaśniamy 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.
Postępowanie z tokenem MediaProjection
Interfejs MediaProjection
API umożliwia aplikacjom uzyskanie tokena MediaProjection
, który zapewnia jednorazowy dostęp
do przechwytywania zawartości ekranu lub dźwięku. System operacyjny Android poprosi użytkownika o zgodę przed przyznaniem tokena aplikacji.
System operacyjny wyświetla aktywne tokeny MediaProjection
w interfejsie Ustawień szybkich i umożliwia użytkownikom cofnięcie dostępu do tokena w dowolnym momencie. W takiej sytuacji wirtualne wyświetlacze lub strumienie audio powiązane z sesją przestają odbierać strumienie multimediów. Aplikacja musi odpowiednio reagować, w przeciwnym razie będzie nadal nagrywać ciszę lub czarny strumień wideo.
Aby poradzić sobie z utratą tokena, zarejestruj wywołanie zwrotne w instancji MediaProjection
za pomocą metody registerCallback
i zatrzymaj nagrywanie, gdy zostanie wywołana metoda onStop
.
Więcej informacji znajdziesz w artykule Projekcja multimediów.
Nagraj film
Aby dowiedzieć się, jak używać interfejsu Media Projection API do przechwytywania ekranu urządzenia w czasie rzeczywistym i wyświetlania go w obiekcie SurfaceView, zapoznaj się z przykładową aplikacją ScreenCapture.
Możesz użyć DevicePolicyManager
, aby zapobiec nagrywaniu ekranu. W przypadku kont firmowych (Android for Work) administrator może wyłączyć zbieranie danych asystenta w profilu służbowym za pomocą metody setScreenCaptureDisabled.
W samouczku Zarządzanie urządzeniami z Androidem bez aplikacji znajdziesz informacje o tym, jak zabronić robienia zrzutów ekranu.
Przechwytywanie odtwarzania dźwięku
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 zrzutu ekranu, ale w przypadku dźwięku. Głównym przypadkiem użycia jest przesyłanie strumieniowe aplikacji, które chcą przechwytywać dźwięk odtwarzany przez gry.
Pamiętaj, że interfejs AudioPlaybackCapture API nie wpływa na opóźnienie aplikacji, z której dźwięk jest przechwytywany.
Tworzenie aplikacji do przechwytywania
Ze względu na bezpieczeństwo i prywatność przechwytywanie odtwarzania podlega pewnym ograniczeniom. Aby aplikacja mogła rejestrować dźwięk, musi spełniać te wymagania:
- Aplikacja musi mieć uprawnienie
RECORD_AUDIO
. - Aplikacja musi wyświetlać prompta wyświetlanego 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, musisz utworzyć obiekt AudioRecord
i dodać do niego AudioPlaybackCaptureConfiguration
. Wykonaj te czynności:
- Zadzwoń pod numer
AudioPlaybackCaptureConfiguration.Builder.build()
, aby utworzyćAudioPlaybackCaptureConfiguration
. - Przekaż konfigurację do
AudioRecord
, wywołując funkcjęsetAudioPlaybackCaptureConfig
.
Sterowanie przechwytywaniem dźwięku
Aplikacja może kontrolować, jakie typy treści może nagrywać i jakie inne aplikacje mogą nagrywać jej odtwarzanie.
Ograniczanie przechwytywania na podstawie treści audio
Aplikacja może ograniczyć zakres nagrywanego dźwięku, korzystając z tych metod:
- Przekaż
AUDIO_USAGE
do funkcji AudioPlaybackCaptureConfiguration.addMatchingUsage(), aby zezwolić na przechwytywanie w określonym przypadku użycia. Wywołaj metodę kilka razy, aby określić więcej niż jedno zastosowanie. - Przekaż
AUDIO_USAGE
do AudioPlaybackCaptureConfiguration.excludeUsage(), aby zabronić przechwytywania tego użycia. Wywołaj metodę kilka razy, aby określić więcej niż jedno zastosowanie. - Przekaż identyfikator UID do funkcji AudioPlaybackCaptureConfiguration.addMatchingUid(), aby przechwytywać tylko aplikacje z określonym identyfikatorem UID. Wywołaj tę metodę kilka razy, aby określić więcej niż 1 identyfikator UID.
- Przekaż identyfikator UID do funkcji AudioPlaybackCaptureConfiguration.excludeUid(), aby zabronić przechwytywania tego identyfikatora. Wywołaj tę metodę kilka razy, aby określić więcej niż 1 identyfikator UID.
Pamiętaj, że nie możesz używać jednocześnie metod addMatchingUsage()
i excludeUsage()
. Musisz wybrać jedną z tych opcji. Nie możesz też używać jednocześnie addMatchingUid()
i excludeUid()
.
Ograniczanie przechwytywania przez inne aplikacje
Możesz skonfigurować aplikację tak, aby uniemożliwić innym aplikacjom przechwytywanie jej dźwięku. Dźwięk z aplikacji można przechwycić tylko wtedy, gdy spełnia ona te wymagania:
Wykorzystanie
Odtwarzacz generujący dźwięk musi określić jego użycie jako USAGE_MEDIA
, USAGE_GAME
lub USAGE_UNKNOWN
.
Zasady przechwytywania
Zasady dotyczące przechwytywania odtwarzacza muszą być ustawione na
AudioAttributes.ALLOW_CAPTURE_BY_ALL
, co umożliwia innym aplikacjom przechwytywanie odtwarzania. Możesz to zrobić na kilka sposobów:
- Aby włączyć przechwytywanie na wszystkich odtwarzaczach, dodaj
android:allowAudioPlaybackCapture="true"
do plikumanifest.xml
aplikacji. - Możesz też włączyć przechwytywanie na wszystkich odtwarzaczach, wywołując
AudioManager.setAllowedCapturePolicy(AudioAttributes.ALLOW_CAPTURE_BY_ALL)
. - Zasady możesz ustawić w przypadku poszczególnych odtwarzaczy podczas ich tworzenia za pomocą narzędzia
AudioAttributes.Builder.setAllowedCapturePolicy(AudioAttributes.ALLOW_CAPTURE_BY_ALL)
. (Jeśli korzystasz zAAudio
połączeniaAAudioStreamBuilder_setAllowedCapturePolicy(AAUDIO_ALLOW_CAPTURE_BY_ALL)
).
Jeśli te wymagania wstępne są spełnione, można przechwycić dowolny dźwięk odtwarzany przez odtwarzacz.
Wyłączanie przechwytywania systemowego
Opisane powyżej zabezpieczenia umożliwiające rejestrowanie dotyczą tylko aplikacji. Komponenty systemu Android mogą domyślnie przechwytywać 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 umożliwiały systemowi rejestrowanie odtwarzania. W rzadkich przypadkach, gdy nie chcesz, aby system rejestrował odtwarzanie w aplikacji, ustaw zasadę rejestrowania na ALLOW_CAPTURE_BY_NONE
.
Ustawianie zasad w czasie działania
Możesz wywołać funkcję AudioManager.setAllowedCapturePolicy()
, aby zmienić zasady przechwytywania podczas działania aplikacji. Jeśli w momencie wywołania metody odtwarzany jest obiekt MediaPlayer lub AudioTrack, dźwięk nie zostanie zmieniony. Aby zmiana zasad zaczęła obowiązywać, musisz zamknąć i ponownie otworzyć odtwarzacz lub ścieżkę.
Zasady = manifest + AudioManager + AudioAttributes
Zasady przechwytywania mogą być określone w kilku miejscach, dlatego ważne jest, aby wiedzieć, jak określa się obowiązujące zasady.
Zawsze stosowane są najbardziej restrykcyjne zasady dotyczące nagrywania. Na przykład aplikacja, której manifest zawiera uprawnienie setAllowedCapturePolicy="false"
, nigdy nie zezwoli aplikacjom niesystemowym na przechwytywanie dźwięku, nawet jeśli wartość AudioManager#setAllowedCapturePolicy
jest ustawiona na ALLOW_CAPTURE_BY_ALL
. Podobnie jeśli zasada
AudioManager#setAllowedCapturePolicy
ma wartość ALLOW_CAPTURE_BY_ALL
, a plik manifestu określa setAllowedCapturePolicy="true"
, ale elementy
AudioAttributes
odtwarzacza multimediów zostały utworzone za pomocą
AudioAttributes.Builder#setAllowedCapturePolicy(ALLOW_CAPTURE_BY_SYSTEM)
, to
ten odtwarzacz multimediów nie będzie dostępny dla aplikacji systemowych.
Tabela poniżej zawiera podsumowanie wpływu atrybutu pliku manifestu i obowiązujących zasad:
allowAudioPlaybackCapture | ALLOW_CAPTURE_BY_ALL | ALLOW_CAPTURE_BY_SYSTEM | ALLOW_CAPTURE_BY_NONE |
---|---|---|---|
true | dowolnej aplikacji, | tylko system | nie przechwycono |
fałsz | tylko system | tylko system | nie przechwycono |