Aplikacja może nagrywać obraz lub dźwięk odtwarzany przez inną aplikację. Takie
aplikacje muszą prawidłowo obsługiwać
MediaProjection token
prawidłowo. 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.
Jak obsługiwać token MediaProjection
Interfejs API MediaProjection
umożliwia aplikacjom uzyskanie tokena MediaProjection, który zapewnia jednorazowy dostęp
do przechwytywania zawartości ekranu lub dźwięku. System operacyjny Android prosi użytkownika o zgodę, zanim przyzna token Twojej aplikacji.
System wyświetla aktywne tokeny MediaProjection w interfejsie Szybkie ustawienia i umożliwia użytkownikom wycofanie dostępu do tokena w dowolnym momencie. Gdy tak się stanie, wirtualne wyświetlacze lub strumienie audio powiązane z sesją przestaną odbierać strumienie multimediów. Twoja aplikacja musi odpowiednio zareagować, w przeciwnym razie będzie nadal nagrywać ciszę lub czarny strumień wideo.
Aby obsłużyć utratę tokena, zarejestruj wywołanie zwrotne w MediaProjection
instancji za pomocą
registerCallback
metody i zatrzymaj nagrywanie, gdy zostanie wywołana
onStop
metoda.
Więcej informacji znajdziesz w artykule Rejestrowanie 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 SurfaceView, zapoznaj się z przykładową aplikacją ScreenCapture.
Możesz użyć DevicePolicyManager
aby uniemożliwić nagrywanie 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 ćwiczeniu z programowania Zarządzanie urządzeniami z Androidem bez aplikacji pokazujemy, jak zablokować robienie 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łównym przypadkiem użycia są aplikacje do strumieniowania, które chcą przechwytywać 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 przechwytywany.
Tworzenie aplikacji do przechwytywania
Ze względów bezpieczeństwa i prywatności przechwytywanie odtwarzania ma pewne ograniczenia. Aby móc przechwytywać dźwięk, aplikacja musi spełniać te wymagania:
- Aplikacja musi mieć uprawnienie
RECORD_AUDIO. - Aplikacja musi wyświetlić prośbę wyświetlaną przez
MediaProjectionManager.createScreenCaptureIntent(), a użytkownik musi ją zaakceptować. - Aplikacje przechwytująca i odtwarzająca muszą znajdować się w tym samym profilu użytkownika.
Aby przechwytywać dźwięk z innej aplikacji, Twoja 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ącsetAudioPlaybackCaptureConfig.
Kontrolowanie przechwytywania dźwięku
Twoja aplikacja może kontrolować, jakie typy treści może nagrywać i jakie inne aplikacje mogą nagrywać jej odtwarzanie.
Ograniczanie przechwytywania według treści audio
Aplikacja może ograniczyć, które dźwięki może przechwytywać, za pomocą tych metod:
- Przekaż
AUDIO_USAGEdo AudioPlaybackCaptureConfiguration.addMatchingUsage() , aby zezwolić na przechwytywanie określonego użycia. Wywołaj metodę kilka razy, aby określić więcej niż 1 użycie. - Przekaż
AUDIO_USAGEdo AudioPlaybackCaptureConfiguration.excludeUsage(), aby zabronić przechwytywania tego użycia. Wywołaj metodę kilka razy, aby określić więcej niż 1 użycie. - Przekaż UID do AudioPlaybackCaptureConfiguration.addMatchingUid() aby przechwytywać tylko aplikacje z określonym UID. Wywołaj metodę kilka razy, aby określić więcej niż 1 UID.
- Przekaż UID do AudioPlaybackCaptureConfiguration.excludeUid() aby zabronić przechwytywania tego UID. Wywołaj metodę kilka razy, aby określić więcej niż 1 UID.
Pamiętaj, że nie możesz używać jednocześnie metod addMatchingUsage() i excludeUsage(). Musisz wybrać jedną z nich. Podobnie nie możesz używać jednocześnie metod 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 przechwytywać tylko wtedy, gdy aplikacja spełnia te wymagania:
Wykorzystanie
Odtwarzacz generujący dźwięk musi ustawić jego użycie
na USAGE_MEDIA,
USAGE_GAME lub
USAGE_UNKNOWN.
Zasady przechwytywania
Zasady przechwytywania odtwarzacza muszą mieć wartość
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, dodaj
android:allowAudioPlaybackCapture="true"do plikumanifest.xmlaplikacji. - Możesz też włączyć przechwytywanie we wszystkich odtwarzaczach, wywołując
AudioManager.setAllowedCapturePolicy(AudioAttributes.ALLOW_CAPTURE_BY_ALL). - Zasady możesz ustawić w przypadku poszczególnych odtwarzaczy, gdy tworzysz je 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 wymagania wstępne są spełnione, można przechwytywać dowolny dźwięk generowany przez odtwarzacz.
Wyłączanie przechwytywania przez system
Opisane powyżej zabezpieczenia umożliwiające przechwytywanie 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. Z tego powodu zalecamy, aby aplikacje zezwalały systemowi na przechwytywanie odtwarzania. W rzadkich przypadkach, gdy nie
chcesz, aby system przechwytywał odtwarzanie Twojej aplikacji, ustaw zasady przechwytywania na
ALLOW_CAPTURE_BY_NONE.
Ustawianie zasad w czasie działania
Możesz wywołać AudioManager.setAllowedCapturePolicy(), aby zmienić zasady przechwytywania podczas działania aplikacji. Jeśli podczas wywoływania metody odtwarzany jest 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 można określić w kilku miejscach, dlatego ważne jest, aby zrozumieć, jak są one określane.
Zawsze stosowane są najbardziej restrykcyjne zasady przechwytywania. Na przykład aplikacja, której
manifest zawiera setAllowedCapturePolicy="false", nigdy nie zezwoli aplikacjom spoza systemu
na przechwytywanie dźwięku, nawet jeśli AudioManager#setAllowedCapturePolicy jest ustawione
na ALLOW_CAPTURE_BY_ALL. Podobnie, jeśli
AudioManager#setAllowedCapturePolicy jest ustawione na ALLOW_CAPTURE_BY_ALL i
manifest ustawia setAllowedCapturePolicy="true", ale
AudioAttributes odtwarzacza multimediów zostały utworzone za pomocą
AudioAttributes.Builder#setAllowedCapturePolicy(ALLOW_CAPTURE_BY_SYSTEM), to
ten odtwarzacz multimediów nie będzie mógł być przechwytywany przez aplikacje spoza systemu.
W tabeli poniżej podsumowano wpływ atrybutu 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 |