Przygotowując materiały (grafiki) do artykułu o menedżerze haseł Bitwarden, wrzuciłem do aplikacji, w której trzymam m.in. pomysły na kolejne artykuły (Trello) cegiełkę dotyczącą zrzutów ekranu, czyli czegoś, z czego często korzystam, i często o to dostaję pytania. Pisząc precyzyjniej, chodzi o zrzuty z ekranu telefonu. Zwłaszcza z aplikacji, które takie operacje blokują. A, że wdrożenie takiej blokady jest wręcz banalne, to coraz więcej aplikacji z tego korzysta, nawet jeśli nie ma takiej potrzeby…

Nagrywanie ekranu w Androidzie nawet z aplikacji, które to blokują

Przez ostatnie kilka lat narzędzi, z których korzystam do tego celu, było co najmniej kilka. Zmieniały się wraz z telefonami i samym Androidem. Zwłaszcza że nie na każdym “robiłem roota”, co zazwyczaj rozwiązywało też problem ewentualnych blokad.

I choć na biurku cały czas leży zrootowana Moto G, by w razie potrzeby ciężar robienia zrzutów ekranu wziąć na siebie, to sięgam po nią – przynajmniej do tego celu – coraz rzadziej. I to pomimo tego, że mój główny telefon (Huawei P20 Lite) nie ma roota, a więc wszelkiej maści ograniczenia w wykonywaniu zrzutów ekranu go dotyczą.

Z pomocą przychodzi program Scrcpy, dzięki czemu obraz z telefonu – korzystająć z ADB i trybu debugowania – mogę wyświetlić na komputerze (aplikacja Twój Telefon, którą Microsoft rozwija w systemie Windows 10 teoretycznie też to potrafi, ale nie wiem, czy i jak radzi sobie z blokadami, bo dla mojego telefonu ta opcja jest niedostępna). A jak mam na komputerze, to zrzuty ekranu mogę robić dowolnie, w tym tak jak w większości przypadków mi najwygodniej. Czyli z wykorzystaniem klawiszy ALT i Print Screen, oraz aplikacji One Drive, dzięki czemu każdy zrzut ekranu automatycznie ląduje jako plik graficzny w odpowiednim katalogu. No i jest jeszcze bonus – za pomocą okna wygenerowanego przez Scrcpy można też sterować telefonem.

Teoretycznie samo ADB też pozwala wykonać zrzut ekranu na telefonie:

adb shell screencap /sdcard/screencap.png

Ale metoda ta – podobnie jak zwykły zrzut ekranu w telefonie – nie działa w przypadku aplikacji, które mają zrzuty ekranu zablokowane.

A z obrazem wyświetlonym na komputerze za pomocą programu Scrcpy (dostępny jest nie tylko na Windowsa, ale i na Linuksa czy MacOS) takiego problemu nie ma:

Powyżej kilka przykładowych zrzutów, z takich aplikacji jak Authy, Signal (z włączoną blokadą), opisywany wczoraj Bitwarden, mBank i Nest Bank, oraz eDO App i mObywatel. Wszystkie z blokadą uniemożliwiającą wykonanie zrzutu z poziomu (niezrootowanego) telefonu.

Obsługa aplikacji Scrcpy

A najlepsze to, że obsługa Scrcpy jest więcej niż prosta. Tak naprawdę potencjalnie największa trudność to uruchomienie trybu debugowania w opcjach dla programisty, oraz wiersza poleceń na komputerze, do którego podłączony jest telefon.

Podstawowe polecenie, z którego najczęściej korzystam to:

scrcpy --window-borderless --stay-awake

Można – tak jak zrobiłem to na testowych zrzutach powyżej – dodać nazwę okna. Wygląda to moim zdaniem słabiej niż wersja “bezramkowa”, ale jest i taka możliwość:

scrcpy --window-title 'Webinsider.pl' --stay-awake

Możemy też bezpośrednio z poziomu Scrcpy nagrać film (MP4, MKV):

scrcpy --record file.mp4 --stay-awake

A nawet przy tej okazji wyłączyć ekran w telefonie, by ewentualnie podnieść trochę wydajność:

scrcpy --no-display --record file.mp4

Możemy wybrać liczbę klatek na sekundę, z jaką ma się wyświetlać na komputerze obraz z telefonu (oficjalnie działa na Androidach w wersji 10 lub nowszych, ale na starszych też ponoć może zadziałać:

--max-fps 15

Domyślnie obraz z telefonu jest pobierany z “przepływnością” (bitrate) 8 Mbps, ale można i to zmienić:

--bit-rate 2M

A nawet włączyć wyświetlanie na pełnym ekranie:

--fullscreen

A do tego obraz można obrócić, jeśli zajdzie taka potrzeba:

--rotation X

Gdzie zamiast X dajemy cyfrę od 1 do 3:

  • 1 – 90 stopni w lewo
  • 2 – 180 stopni
  • 3 – 90 stopni w prawo

Można też użyć zera (0), by obrócić obraz o 360 stopni… ;-)

Gdy coś nie działa

Może się zdarzyć, że podczas próby uruchomienia aplikacji zamiast okna z podglądem ekranu telefonu pojawi się błąd i aplikacja zakończy działanie. Przyczyn może być sporo, ale z doświadczenia wiem, że dość popularny jest taki oto błąd:

INFO: Renderer: direct3d
INFO: Initial texture: 1080x2336
WARN: Device disconnected
[server] ERROR: Exception on thread Thread[main,5,main]
android.media.MediaCodec$CodecException: Error 0xfffffff4
        at android.media.MediaCodec.native_configure(Native Method)
        at android.media.MediaCodec.configure(MediaCodec.java:2024)
        at android.media.MediaCodec.configure(MediaCodec.java:1952)
        at com.genymobile.scrcpy.ScreenEncoder.configure(ScreenEncoder.java:237)
        at com.genymobile.scrcpy.ScreenEncoder.internalStreamScreen(ScreenEncoder.java:90)
        at com.genymobile.scrcpy.ScreenEncoder.streamScreen(ScreenEncoder.java:61)
        at com.genymobile.scrcpy.Server.scrcpy(Server.java:80)
        at com.genymobile.scrcpy.Server.main(Server.java:255)
        at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
        at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:380)
WARN: Killing the server...

Wtedy do polecenia wystarczy dodać parametr zmieniający rozdzielczość dla podglądu, np.:

-m 1080

Cała komenda może wtedy wyglądać np. tak:

scrcpy --window-title 'Webinsider.pl' --stay-awake -m 1080

Niedawno w ten sposób ratowałem podgląd na komputerze znajomego, dziś musiałem sam skorzystać z tego “triku” (padła mi karta graficzna, i najwidoczniej zintegrowana z procesorem nie potrafiła sobie poradzić w standardowej konfiguracji, a może po prostu monitor za mały, bo tylko 1080p ;-)).

(!) Zgłoś błąd na stronie | Lub postaw nam kawę :-)
LUTy dla D-Cinelike (DJI Mini 3 Pro, DJI Avata, OSMO Pocket) od MiniFly
Wdrożenie Omnibusa w sklepie na WooCommerce
Jak (legalnie) latać dronem w Kategorii Otwartej
Patryk