Jak mogę zrobić zrzut ekranu z wybranego obszaru ekranu telefonu nie przez żaden program, ale z kodu?
android
screenshot
korovaisdead
źródło
źródło
Odpowiedzi:
Oto kod, który pozwolił mi zapisać mój zrzut ekranu na karcie SD i wykorzystać go później do jakichkolwiek potrzeb:
Najpierw musisz dodać odpowiednie uprawnienie do zapisania pliku:
A to jest kod (działający w działaniu):
I w ten sposób możesz otworzyć ostatnio wygenerowany obraz:
Jeśli chcesz użyć tego w widoku fragmentu, użyj:
zamiast
na funkcji takeScreenshot ()
Uwaga :
To rozwiązanie nie działa, jeśli okno dialogowe zawiera widok powierzchni. Aby uzyskać szczegółowe informacje, sprawdź odpowiedź na następujące pytanie:
Android Zrzut ekranu z widoku powierzchni pokazuje czarny ekran
źródło
mCurrentUrlMask
musi byćView
odkąd jest unikalną klasą w interfejsie API Androida, która ma tęgetRootView()
metodę. Prawdopodobnie jest to widok w interfejsie użytkownika.View v1 = mCurrentUrlMask.getRootView();
użyłemView v1 = getWindow().getDecorView().getRootView();
i to działa dla mnie.Wywołaj tę metodę, przekazując najbardziej zewnętrzną grupę ViewGroup, z której chcesz zrzut ekranu:
źródło
view
? 'getWindow().getDecorView().getRootView()
jako widok powoduje wykonanie zrzutu ekranu samej aplikacji - nie ekranu.Uwaga: działa tylko dla zrootowanego telefonu
Programowo możesz uruchomić
adb shell /system/bin/screencap -p /sdcard/img.png
jak poniżejnastępnie przeczytaj
img.png
jakoBitmap
i użyj według własnego uznania.źródło
System.err : java.io.IOException: Error running exec(). Command: [su] Working Directory: null Environment: null
, moje urządzenie to Android 5.0EDYCJA: zmiłuj się nad głosującymi. Tak było w 2010 roku, kiedy odpowiedziałem na pytanie.
Wszystkie programy zezwalające na zrzuty ekranu działają tylko na zrootowanych telefonach.
źródło
Ta metoda nie wymaga uprawnień administratora ani dużego kodowania .
W powłoce adb za pomocą poniższego polecenia możesz zrobić zrzut ekranu.
To polecenie nie wymaga żadnych uprawnień roota, więc możesz wykonać je również z kodu Java aplikacji na Androida.
Więcej informacji o kluczowym kodzie w Androidzie można znaleźć na stronie http://developer.android.com/reference/android/view/KeyEvent.html
Tutaj wykorzystaliśmy. KEYCODE_SYSRQ jego wartość wynosi 120 i jest używana dla klucza żądania systemu / ekranu drukowania.
Jak powiedział CJBS, obraz wyjściowy zostanie zapisany w / sdcard / Pictures / Screenshots
źródło
/sdcard/Pictures/Screenshots
su -c "input keyevent 120"
jest ok !!Odpowiedź Mualiga jest bardzo dobra, ale miałem ten sam problem, który opisuje Ewoks, nie dostaję tła. Czasami więc jest wystarczająco dobry, a czasem pojawia się czarny tekst na czarnym tle (w zależności od tematu).
To rozwiązanie jest mocno oparte na kodzie Mualig i kodzie, który znalazłem w Robotium. Odrzucam użycie pamięci podręcznej rysowania, dzwoniąc bezpośrednio do metody rysowania. Wcześniej postaram się wyciągnąć tło z bieżącej aktywności, aby narysować je jako pierwsze.
źródło
Dodaj uprawnienie do manifestu
Aby obsługiwać Marshmallow lub nowsze wersje, dodaj poniższy kod w metodzie działania onCreate
źródło
Jako odniesienie, jednym ze sposobów przechwytywania ekranu (a nie tylko aktywności aplikacji) jest przechwycenie bufora ramki (device / dev / graphic / fb0). Aby to zrobić, musisz mieć uprawnienia administratora lub aplikacja musi być aplikacją z uprawnieniami do podpisu („Zezwolenie, które system przyznaje tylko wtedy, gdy wnioskująca aplikacja jest podpisana tym samym certyfikatem co aplikacja, która zadeklarowała pozwolenie”) - bardzo mało prawdopodobne, chyba że skompilowałeś własny ROM.
Każde przechwycenie bufora ramki, z kilku testowanych urządzeń, zawierało dokładnie jeden zrzut ekranu. Ludzie zgłaszali, że zawiera więcej, myślę, że zależy to od rozmiaru ramki / wyświetlacza.
Próbowałem ciągle czytać bufor ramki, ale wydaje się, że zwraca określoną ilość odczytanych bajtów. W moim przypadku jest to (3 410 432) bajtów, co wystarcza do przechowywania ramki wyświetlania 854 * 480 RGBA (3 279 360 bajtów). Tak, ramka w formacie binarnym wyprowadzana z fb0 to RGBA w moim urządzeniu. Najprawdopodobniej będzie to zależeć od urządzenia. Będzie to ważne, aby go zdekodować =)
W moim urządzeniu / dev / graphic / fb0 uprawnienia są tak, że tylko root i użytkownicy z grafiki grupowej mogą odczytać fb0.
grafika jest grupą ograniczoną, więc prawdopodobnie będziesz uzyskiwać dostęp do fb0 tylko przy użyciu zrootowanego telefonu za pomocą polecenia su.
Aplikacje na Androida mają identyfikator użytkownika (identyfikator użytkownika) = aplikacja _ ## i identyfikator grupy (identyfikator GUID) = aplikacja _ ## .
adb shell ma uid = shell i guid = shell , który ma znacznie więcej uprawnień niż aplikacja. Możesz faktycznie sprawdzić te uprawnienia na /system/permissions/platform.xml
Oznacza to, że będziesz mógł odczytać fb0 w powłoce adb bez roota, ale nie będziesz czytać jej w aplikacji bez rootowania.
Ponadto udzielenie uprawnień READ_FRAME_BUFFER i / lub ACCESS_SURFACE_FLINGER w AndroidManifest.xml nie zrobi nic w przypadku zwykłej aplikacji, ponieważ będą one działać tylko w przypadku aplikacji „ podpisowych ”.
Sprawdź także ten zamknięty wątek, aby uzyskać więcej informacji.
źródło
Moje rozwiązanie to:
i
Obrazy są zapisywane w folderze pamięci zewnętrznej.
źródło
view
czego przekazujeszImageUtils.loadBitmapFromView(this, view)
?Możesz wypróbować następującą bibliotekę: http://code.google.com/p/android-screenshot-library/ Biblioteka zrzutów ekranu Androida (ASL) umożliwia programowe przechwytywanie zrzutów ekranu z urządzeń z Androidem bez konieczności posiadania uprawnień dostępu root. Zamiast tego ASL wykorzystuje natywną usługę działającą w tle, uruchamianą przez Android Debug Bridge (ADB) raz na urządzenie.
źródło
Na podstawie odpowiedzi @JustinMorris powyżej i @NiravDangi tutaj https://stackoverflow.com/a/8504958/2232148 musimy wziąć tło i pierwszy plan widoku i złożyć je w następujący sposób:
Parametr jakości zajmuje stałą Bitmap.Config, zwykle albo
Bitmap.Config.RGB_565
czyBitmap.Config.ARGB_8888
.źródło
DODAJ ZEZWOLENIE
źródło
Możesz spróbować zrobić coś takiego,
Uzyskiwanie bufora bitmapy z układu lub widoku, wykonując coś takiego: Najpierw musisz
setDrawingCacheEnabled
przejść do układu (liniowy układ lub układ względny lub widok)następnie
Następnie rób co chcesz z bitmapą. Przekształć go w plik obrazu lub wyślij bitmapę do innego miejsca.
źródło
Dla tych, którzy chcą przechwycić GLSurfaceView, metoda getDrawingCache lub rysowanie na płótnie nie będzie działać.
Musisz przeczytać zawartość bufora ramki OpenGL po wyrenderowaniu ramki. Jest to dobra odpowiedź tutaj
źródło
Stworzyłem prostą bibliotekę, która pobiera zrzut ekranu z
View
i albo daje obiekt Bitmap, albo zapisuje go bezpośrednio do dowolnej ścieżki, którą chceszhttps://github.com/abdallahalaraby/Blink
źródło
Screenshot.takeScreenshot(view, mPath); imageView.setImageBitmap(Screenshot.getBitmapScreenshot(view, mPath));
jak uzyskać widok bieżącej działalności. Nie chcę używać identyfikatora xml.takeScreenshotForScreen()
zamiast tego.Krótka droga jest
źródło
Po prostu rozszerzam odpowiedź taraloca. Musisz dodać następujące wiersze, aby działało. Nazwa obrazu stała się statyczna. Upewnij się, że używasz zmiennej znacznika czasu Taraloca, ponieważ potrzebujesz dynamicznej nazwy obrazu.
A w pliku AndroidManifest.xml należy wprowadzić następujące wpisy:
źródło
Jeśli chcesz zrobić zrzut ekranu,
fragment
wykonaj następujące czynności:Zastąp
onCreateView()
:Logika robienia zrzutu ekranu:
metoda
shareScreenShotM)()
:metoda takeScreenShot ():
Metoda savePic ():
Do aktywności możesz po prostu użyć
View v1 = getWindow().getDecorView().getRootView();
zamiastmView
źródło
Większość odpowiedzi na to pytanie używa
Canvas
metody rysowania lub pamięci podręcznej rysowania. JednakView.setDrawingCache()
metoda jest przestarzała w API 28 . Obecnie zalecanym API do tworzenia zrzutów ekranu jestPixelCopy
klasa dostępna z API 24 (ale metody, które akceptująWindow
parametry, są dostępne z API 26 == Android 8.0 Oreo). Oto przykładowy kod Kotlin do pobieraniaBitmap
:źródło
Tylko do aplikacji systemowych!
Uwaga: aplikacje systemowe nie muszą uruchamiać „su”, aby wykonać to polecenie.
źródło
Widok parametrów jest obiektem układu głównego.
źródło
Zrzut ekranu z przewijaniem całej strony
Jeśli chcesz przechwycić pełny zrzut ekranu (który zawiera mniej więcej widok przewijania), sprawdź tę bibliotekę
Wszystko, co musisz zrobić, to zaimportować Gradel i stworzyć obiekt BigScreenshot
BigScreenshot longScreenshot = new BigScreenshot(this, x, y);
Oddzwonienie zostanie odebrane z bitmapą Zrzutów ekranu wykonanych podczas automatycznego przewijania grupy widoków ekranu i na końcu połączonych razem.
@Override public void getScreenshot(Bitmap bitmap) {}
Które można zapisać w galerii lub jakikolwiek sposób użycia jest konieczny po ich zakończeniu
źródło
Wykonaj zrzut ekranu widoku w Androidzie.
źródło
jeśli chcesz uchwycić widok lub układ, taki jak RelativeLayout lub LinearLayout itp., po prostu użyj kodu:
teraz możesz zapisać tę bitmapę w pamięci urządzenia poprzez:
źródło