Wie kann ich einen Screenshot eines ausgewählten Bereichs des Telefonbildschirms nicht mit einem Programm, sondern mit Code erstellen?
android
screenshot
korovaisdead
quelle
quelle
Antworten:
Hier ist der Code, mit dem mein Screenshot auf einer SD-Karte gespeichert und später für alle Ihre Anforderungen verwendet werden konnte:
Zunächst müssen Sie eine entsprechende Berechtigung hinzufügen, um die Datei zu speichern:
Und dies ist der Code (der in einer Aktivität ausgeführt wird):
Und so können Sie das kürzlich generierte Bild öffnen:
Wenn Sie dies in der Fragmentansicht verwenden möchten, verwenden Sie:
anstatt
auf takeScreenshot () Funktion
Hinweis :
Diese Lösung funktioniert nicht, wenn Ihr Dialogfeld eine Oberflächenansicht enthält. Für Details überprüfen Sie bitte die Antwort auf die folgende Frage:
Android Screenshot der Oberflächenansicht zeigt schwarzen Bildschirm
quelle
mCurrentUrlMask
muss eineView
eindeutige Klasse in der Android-API sein, die über diegetRootView()
Methode verfügt. Wahrscheinlich ist eine Ansicht in der Benutzeroberfläche.View v1 = mCurrentUrlMask.getRootView();
ich verwendetView v1 = getWindow().getDecorView().getRootView();
und es funktioniert für mich.Rufen Sie diese Methode auf und übergeben Sie die äußerste ViewGroup, von der Sie einen Screenshot erhalten möchten:
quelle
view
? `getWindow().getDecorView().getRootView()
die Ansicht übergeben, wird nur ein Screenshot der App erstellt - nicht des Bildschirms.Hinweis: Funktioniert nur für gerootete Telefone
Programmatisch können Sie
adb shell /system/bin/screencap -p /sdcard/img.png
wie folgt ausführendann lesen Sie ,
img.png
wieBitmap
und verwenden wie Sie es wünschen.quelle
System.err : java.io.IOException: Error running exec(). Command: [su] Working Directory: null Environment: null
, mein Gerät ist Android 5.0EDIT: Erbarme dich der Abstimmungen. Es war 2010 wahr, als ich die Frage beantwortete.
Alle Programme, die Screenshots ermöglichen, funktionieren nur auf gerooteten Telefonen.
quelle
Für diese Methode ist keine Root-Berechtigung oder keine große Codierung erforderlich.
Auf der ADB-Shell können Sie mit dem folgenden Befehl einen Screenshot machen.
Für diesen Befehl ist keine Root-Berechtigung erforderlich, sodass Sie ihn auch über den Java-Code der Android-Anwendung ausführen können.
Weitere Informationen zum Keyevent-Code in Android finden Sie unter http://developer.android.com/reference/android/view/KeyEvent.html
Hier haben wir verwendet. KEYCODE_SYSRQ Der Wert ist 120 und wird für die Systemanforderungs- / Druckbildschirmtaste verwendet.
Wie CJBS sagte, wird das Ausgabebild in / sdcard / Pictures / Screenshots gespeichert
quelle
/sdcard/Pictures/Screenshots
su -c "input keyevent 120"
ist in Ordnung!!Die Antwort von Mualig ist sehr gut, aber ich hatte das gleiche Problem, das Ewoks beschreibt. Ich verstehe den Hintergrund nicht. Manchmal ist es also gut genug und manchmal bekomme ich schwarzen Text über schwarzem Hintergrund (je nach Thema).
Diese Lösung basiert stark auf Mualig-Code und dem Code, den ich in Robotium gefunden habe. Ich verwerfe die Verwendung des Zeichencaches, indem ich direkt die Zeichenmethode aufrufe. Vorher werde ich versuchen, den Hintergrund aus der aktuellen Aktivität zu zeichnen, um ihn zuerst zu zeichnen.
quelle
Fügen Sie die Berechtigung im Manifest hinzu
Fügen Sie zur Unterstützung von Marshmallow oder höheren Versionen den folgenden Code in die Aktivität onCreate-Methode ein
quelle
Als Referenz besteht eine Möglichkeit, den Bildschirm (und nicht nur Ihre App-Aktivität) zu erfassen, darin, den Framebuffer (Gerät / dev / Grafik / fb0) zu erfassen . Dazu müssen Sie entweder über Root-Rechte verfügen oder Ihre App muss eine App mit Signaturberechtigungen sein ("Eine Berechtigung, die das System nur erteilt, wenn die anfordernde Anwendung mit demselben Zertifikat signiert ist wie die Anwendung, die die Berechtigung deklariert hat") Sehr unwahrscheinlich, es sei denn, Sie haben Ihr eigenes ROM kompiliert.
Jede Framebuffer-Erfassung von einigen Geräten, die ich getestet habe, enthielt genau einen Screenshot. Die Leute haben berichtet, dass es mehr enthält, ich denke, es hängt von der Rahmen- / Anzeigegröße ab.
Ich habe versucht, den Framebuffer kontinuierlich zu lesen, aber er scheint für eine feste Anzahl gelesener Bytes zurückzukehren. In meinem Fall sind das (3 410 432) Bytes, was ausreicht, um einen Anzeigerahmen von 854 * 480 RGBA (3 279 360 Bytes) zu speichern. Ja, der von fb0 ausgegebene Frame in Binärform ist RGBA in meinem Gerät. Dies hängt höchstwahrscheinlich von Gerät zu Gerät ab. Dies ist wichtig für Sie, um es zu dekodieren =)
In meinem Gerät / dev / graphics / fb0 sind die Berechtigungen so, dass nur root und Benutzer aus Gruppengrafiken die fb0 lesen können.
Grafik ist eine eingeschränkte Gruppe, daher werden Sie wahrscheinlich nur mit einem gerooteten Telefon mit dem Befehl su auf fb0 zugreifen.
Android-Apps haben die Benutzer-ID (uid) = app _ ## und die Gruppen- ID (guid) = app _ ## .
Die adb-Shell verfügt über uid = shell und guid = shell , die viel mehr Berechtigungen als eine App haben. Sie können diese Berechtigungen tatsächlich unter /system/permissions/platform.xml überprüfen
Dies bedeutet, dass Sie fb0 in der ADB-Shell ohne Root lesen können, aber nicht in der App ohne Root.
Wenn Sie READ_FRAME_BUFFER- und / oder ACCESS_SURFACE_FLINGER-Berechtigungen für AndroidManifest.xml erteilen, funktioniert dies für eine reguläre App nicht, da diese nur für Signatur -Apps funktionieren .
Überprüfen Sie auch diesen geschlossenen Thread für weitere Details.
quelle
Meine Lösung ist:
und
Bilder werden im externen Speicherordner gespeichert.
quelle
view
gehst duImageUtils.loadBitmapFromView(this, view)
?Sie können die folgende Bibliothek ausprobieren: http://code.google.com/p/android-screenshot-library/ Mit der Android Screenshot Library (ASL) können Screenshots von Android-Geräten programmgesteuert erfasst werden, ohne dass Root-Zugriffsrechte erforderlich sind. Stattdessen verwendet ASL einen nativen Dienst, der im Hintergrund ausgeführt wird und einmal pro Gerätestart über die Android Debug Bridge (ADB) gestartet wird.
quelle
Basierend auf der Antwort von @JustinMorris oben und @NiravDangi hier https://stackoverflow.com/a/8504958/2232148 müssen wir den Hintergrund und den Vordergrund einer Ansicht nehmen und sie wie folgt zusammenstellen:
Der Qualitätsparameter nimmt eine Konstante von Bitmap.Config an, normalerweise entweder
Bitmap.Config.RGB_565
oderBitmap.Config.ARGB_8888
.quelle
ERLAUBNIS HINZUFÜGEN
quelle
Sie können versuchen, so etwas zu tun,
Abrufen eines Bitmap-Cache aus einem Layout oder einer Ansicht, indem Sie beispielsweise "Zuerst müssen Sie" ausführen
setDrawingCacheEnabled
Folgendes ausführen: ein Layout erstellen (ein lineares Layout oder ein relatives Layout oder eine Ansicht).dann
Dann machen Sie mit der Bitmap, was Sie wollen. Entweder verwandeln Sie es in eine Bilddatei oder senden Sie die Uri der Bitmap an einen anderen Ort.
quelle
Für diejenigen, die eine GLSurfaceView erfassen möchten, funktioniert die Methode getDrawingCache oder Zeichnen auf Leinwand nicht.
Sie müssen den Inhalt des OpenGL-Framebuffers lesen, nachdem der Frame gerendert wurde. Es gibt eine gute Antwort hier
quelle
Ich habe eine einfache Bibliothek erstellt, die einen Screenshot von einem macht
View
und Ihnen entweder ein Bitmap-Objekt gibt oder es direkt in einem beliebigen Pfad speicherthttps://github.com/abdallahalaraby/Blink
quelle
Screenshot.takeScreenshot(view, mPath); imageView.setImageBitmap(Screenshot.getBitmapScreenshot(view, mPath));
wie Sie einen Überblick über die aktuelle Aktivität erhalten. Ich möchte nicht die ID der XML verwenden.takeScreenshotForScreen()
stattdessen.Kurzer Weg ist
quelle
Nur Taralocas Antwort erweitern. Sie müssen folgende Zeilen hinzufügen, damit es funktioniert. Ich habe den Bildnamen statisch gemacht. Stellen Sie sicher, dass Sie die Zeitstempelvariable von taraloca verwenden, falls Sie einen dynamischen Bildnamen benötigen.
Und in der Datei AndroidManifest.xml müssen folgende Einträge vorhanden sein:
quelle
Wenn Sie einen Screenshot von machen möchten, gehen Sie
fragment
wie folgt vor:Überschreiben
onCreateView()
:Logik zum Screenshot:
Methode
shareScreenShotM)()
:Methode takeScreenShot ():
Methode savePic ():
Für Aktivitäten können Sie einfach
View v1 = getWindow().getDecorView().getRootView();
anstelle von verwendenmView
quelle
Die meisten Antworten auf diese Frage verwenden die
Canvas
Zeichenmethode oder die Zeichencache-Methode. DieView.setDrawingCache()
Methode ist jedoch in API 28 veraltet . Derzeit ist die empfohlene API zum Erstellen von Screenshots diePixelCopy
von API 24 verfügbare Klasse (die Methoden, dieWindow
Parameter akzeptieren , sind jedoch von API 26 == Android 8.0 Oreo verfügbar). Hier ist ein Beispiel für einen Kotlin-Code zum Abrufen einesBitmap
:quelle
Nur für Systemanwendungen!
Hinweis: Systemanwendungen müssen "su" nicht ausführen, um diesen Befehl auszuführen.
quelle
Die Parameteransicht ist das Stammlayoutobjekt.
quelle
Für einen ganzseitigen Bildlauf-Screenshot
Wenn Sie einen vollständigen Screenshot der Ansicht (der eine Bildlaufansicht oder so enthält) aufnehmen möchten, überprüfen Sie diese Bibliothek
Sie müssen lediglich Gradel importieren und ein Objekt von BigScreenshot erstellen
BigScreenshot longScreenshot = new BigScreenshot(this, x, y);
Ein Rückruf wird mit der Bitmap der aufgenommenen Screenshots empfangen, während automatisch durch die Bildschirmansichtsgruppe gescrollt und am Ende zusammengesetzt wird.
@Override public void getScreenshot(Bitmap bitmap) {}
Welche in der Galerie gespeichert werden können oder welche Verwendung auch immer benötigt wird, ist deren Nachbearbeitung erforderlich
quelle
Machen Sie einen Screenshot einer Ansicht in Android.
quelle
Wenn Sie eine Ansicht oder ein Layout wie RelativeLayout oder LinearLayout usw. erfassen möchten, verwenden Sie einfach den folgenden Code:
Jetzt können Sie diese Bitmap im Gerätespeicher speichern, indem Sie:
quelle