W tym wpisie przedstawiałem, w jaki sposób zrobić zrzuty ekranu aplikacji bez dodatkowych bibliotek. Wspomniałem tam, aby wykonać pełny zrzut ekranu trzeba skorzystać z MediaProjection. W tym artykule właśnie pokaże Ci dokładnie, w jaki sposób to wykonać. Przechwytywanie ekranu za pomocą MediaProjection nie jest zbyt skomplikowane. Za jego pomocą możemy nagrywać obraz, jak i wykonać zdjęcie, zatem zapraszam do lektury 🙂

1. Robienie screenshot’a.

Na początku przyda nam się funkcja, która zmierzy nam wymiary ekranu:

Metoda do pobierania obrazu:

Główna metoda może wyglądać tak:

Na początku musimy wywołać metodę getSystemService z parametrem MEDIA_PROJECTION_SERVICE, która zapewnia uzyskiwania pozwolenia na przechwytywanie obrazu. Dalej mMediaProjectionManager.createScreenCaptureIntent() jest stosowana, aby uruchomić intencji.

MediaProjection permission

Metoda onActivityResult obsługuje wywołania zwrotne i może wyglądać następująco:

Po udostępnieniu mMediaProjection możliwe jest teraz utworzenie wirtualnego ekranu (złożonego ze wszystkich widocznych powierzchni) i wskazanie Androidowi, na którą powierzchnię chcesz skopiować ekran – w naszym przypadku jest to mImageReader.getSurface(). Do przechwytywania ekranu i zapisaniu do obrazu posłuży nam wywowałanie – mImageReader.setOnImageAvailableListener( this, null); Na koniec metoda czyszcząca:

2. Nagrywanie ekranu.

Do nagrywania obrazu skorzystamy z MediaRecorder. Metoda główna zmieni się na coś takiego:

Kod jest prosty i podobny do wcześniejszego zamiast ImageReader mamy MediaRecoder. Funkcja do zatrzymywania nagrywania może wyglądać tak:

Zastosowałem tutaj celowo SystemClock.sleep(500), ponieważ gdy rozpoczniemy i od razu zatrzymamy nagrywanie, dostaniemy wyjątek. Błąd spowodowany jest tym, że mediarecoder nie otrzymał żadnych informacji o ekranie.

Metoda do zainicjowania mediarecodera:

Jeżeli nie chcesz nagrywać dźwięku, możesz usunąć wpisy związane z audio. Dźwięk jest zbierany przez mikrofon, także otoczenie też się zarejestruje,  Ostatnia metoda, która pobiera lokalizację do zapisu pliku wideo:

3. Podsumowanie.

Krótko i na temat. Powyższy kod można też zmienić i nie koniecznie musisz korzystać z tego rozwiązania, które przedstawiłem. Na przykład, zamiast MediaRecorder można zastosować MediaMuxerMediaCodec, ale uznałem, że powyższy sposób jest prostszy i też skuteczny. Przykładową aplikację można znaleźć tutaj.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *