Wie Sie programmgesteuert nehmen Sie einen screenshot auf Android?
Wie kann ich einen screenshot von einem ausgewählten Bereich der Handy-Bildschirm nicht von jedem Programm code?
- Nicht vom emulator. Ich brauche, um screenshot von dem Teil in meinem programm, und tun etwas mit ihm im gleichen programm.
- Eine weitere gute Referenz: stackoverflow.com/a/10296881/439171
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist der code, der erlaubt, dass meine screenshot gespeichert werden auf einer SD-Karte und später für was auch immer Ihre Bedürfnisse sind:
Ersten, müssen Sie eine entsprechende Berechtigung, die Datei zu speichern:
- Und dies ist der code (in eine Tätigkeit):
Und dies ist, wie Sie können, öffnen Sie die zuletzt erzeugte Bild:
Wenn Sie wollen verwenden Sie diese auf fragment-Ansicht verwenden Sie dann:
statt
auf takeScreenshot() Funktion
Hinweis:
Diese Lösung funktioniert nicht, wenn das Dialogfeld enthält eine Oberfläche anzeigen. Für details überprüfen Sie bitte die Antwort auf folgende Frage:
Android Screenshot der Surface View Zeigt Schwarzen Bildschirm
View
da ist die einzigartige Klasse in der Android-API, hat diegetRootView()
Methode. Wahrscheinlich ist ein Blick in die UI.View v1 = mCurrentUrlMask.getRootView();
ich verwendet habeView v1 = getWindow().getDecorView().getRootView();
und es funktioniert für mich.EACCES (Permission denied)
Fehler, fügen Sie Folgendes zu Ihrer AndroidManifest.xml:<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Diese Methode aufrufen, übergeben Sie in der äußeren ViewGroup, die Sie möchten ein Bild:
view
?`getWindow().getDecorView().getRootView()
wie die Ergebnisse anzeigen, die in einen screenshot einfach die app, nicht den Bildschirm.Hinweis: funktioniert nur für verwurzelt Telefon
Programmgesteuert können Sie
adb shell /system/bin/screencap -p /sdcard/img.png
wie untendann Lesen
img.png
alsBitmap
und nutzen Sie es als Ihr Wunsch.System.err : java.io.IOException: Error running exec(). Command: [su] Working Directory: null Environment: null
mein Gerät ist android 5.0EDIT: habe Erbarmen mit den downvotes. Es war wahr, im Jahr 2010, als ich die Frage beantwortet.
Alle Programme, mit denen screenshots funktioniert nur auf gerooteten Handys.
Keine root-Berechtigung oder keine große Kodierung benötigt wird für diese Methode.
Auf adb shell mit nachstehenden Befehl können Sie take screen shot.
Dieser Befehl nicht erforderlich root-Berechtigung, so gleichen Sie können ausführen von java-code aus der android-Anwendung auch.
Mehr über keyevent-code in android sehen http://developer.android.com/reference/android/view/KeyEvent.html
Hier haben wir verwendet. KEYCODE_SYSRQ sein Wert ist 120 und für den System-Request - /Druck-Taste.
Als CJBS sagte, Das output-Bild gespeichert werden /sdcard/Pictures/Screenshots
/sdcard/Pictures/Screenshots
su -c "input keyevent 120"
ist ok!!Mualig Antwort ist sehr gut, aber ich hatte das gleiche problem Ewoks beschreibt, ich bin nicht immer der hintergrund. Also manchmal ist gut genug, und manchmal bekomme ich schwarzen text auf schwarzem hintergrund (je nach Thema).
Diese Lösung ist stark basiert in Mualig code und der code, den ich gefunden habe in Robotium. Ich bin verwerfen die Verwendung der Zeichnung cache durch den Aufruf direkt in der draw-Methode. Vor, dass ich werde versuchen, den hintergrund drawable aus der aktuellen Tätigkeit zu ziehen Sie es zuerst.
Fügen Sie die permission im manifest
Zur Unterstützung Marshmallow oder höher Versionen, bitte fügen Sie den untenstehenden code in der activity onCreate-Methode
Als Referenz, ein Weg, auf dem Bildschirm erfassen (und nicht nur Ihre app-Aktivität) ist das erfassen der framebuffer (device /dev/graphics/fb0). Um dies zu tun, müssen Sie entweder root-Rechte oder muss Ihre app eine app mit Signatur-Berechtigungen ("Eine Berechtigung an, die das system nur gewährt, wenn der anfragende Applikation mit demselben Zertifikat signiert sind, als die Anwendung erklärt, dass die Genehmigung") - das ist sehr unwahrscheinlich, es sei denn man kompiliert Sie Ihre eigenen ROM.
Jeder framebuffer erfassen, von ein paar Geräten, die ich getestet habe, enthalten genau einen screenshot. Menschen haben berichtet, enthalten mehr, ich denke, es hängt vom Rahmen/display-Größe.
Versuchte ich, zu Lesen in den framebuffer ständig, aber es scheint wieder eine Feste Anzahl an bytes Lesen. In meinem Fall, dass ist (3 410 432) bytes, was genug ist, zum speichern eines display-Rahmen von 854*480 RGBA (3 279 360 bytes). Ja, der Rahmen, in binäre, ausgegeben von fb0 ist RGBA in meinem Gerät. Dies wird wahrscheinlich abhängig von Gerät zu Gerät. Dies wird für Sie wichtig sein, Sie zu entschlüsseln =)
In meinem Gerät /dev/graphics/fb0 Berechtigungen so, dass nur root und Benutzer aus der Gruppe der Grafiken Lesen kann die fb0.
Grafiken eine geschlossene Gruppe, so werden Sie wahrscheinlich nur Zugriff auf fb0 mit einem gerooteten Handy mit dem su-Befehl.
Android-apps haben die Benutzer-id (uid) = app_## und Gruppen-id (guid) = app_## .
adb shell hat uid = shell und guid = shell, die deutlich mehr Berechtigungen, als app. Sie können tatsächlich überprüfen Sie diese Berechtigungen auf /system/permissions/platform.xml
Das bedeutet, Sie werden in der Lage sein zu Lesen fb0 in der adb shell ohne root-aber du wirst es nicht Lesen in der app ohne root.
Auch, was READ_FRAME_BUFFER und/oder ACCESS_SURFACE_FLINGER Berechtigungen auf AndroidManifest.xml nichts für eine normale app, da diese arbeiten nur für 'Signatur' apps.
Überprüfen Sie auch diese geschlossenen thread für mehr details.
Meine Lösung ist:
und
Bilder sind gespeichert in dem externen Speicher Ordner.
view
Sie vorbei sind, umImageUtils.loadBitmapFromView(this, view)
?Können Sie versuchen, die folgenden Bibliotheken:
http://code.google.com/p/android-screenshot-library/
Android Screenshot Library (ASL) ermöglicht programmgesteuert screenshots von Android-Geräten ohne die Notwendigkeit, root-Zugriffsberechtigungen. Stattdessen ASL nutzt einen einheitlichen Dienst im hintergrund läuft, nun über die Android Debug Bridge (ADB) einmal pro Gerät boot.
HINZUFÜGEN GENEHMIGUNG
Basiert auf der Antwort von @JustinMorris oben und @NiravDangi hier https://stackoverflow.com/a/8504958/2232148 wir müssen die hintergrund-und Vordergrund-view-und montieren Sie diese folgendermaßen:
Den quality-parameter braucht eine Konstante der Bitmap.Config, in der Regel entweder
Bitmap.Config.RGB_565
oderBitmap.Config.ARGB_8888
.Können Sie versuchen, so etwas zu tun,
Immer eine bitmap-cache von einem layout-oder Entwurfsansicht, indem es so etwas wie
Zuerst musst du
setDrawingCacheEnabled
zu einem layout(ein linearlayout oder relativelayout, oder ein Blick)dann
Dann tun Sie, was Sie wollen mit der bitmap. Entweder drehen Sie es in eine image-Datei, oder senden Sie die bitmap-uri woanders hin.
Für diejenigen, die wollen, um zu erfassen eine GLSurfaceView, die getDrawingCache oder zeichnen auf canvas-Methode wird nicht funktionieren.
Lesen Sie den Inhalt des OpenGL-framebuffer, nachdem der frame gerendert wurde. Es ist eine gute Antwort hier
Kurzen Weg
Habe ich eine einfache Bibliothek, macht einen screenshot von einem
View
und entweder gibt Sie ein Bitmap-Objekt oder speichert es direkt auf einen Pfad, die Sie wollenhttps://github.com/abdallahalaraby/Blink
Screenshot.takeScreenshot(view, mPath); imageView.setImageBitmap(Screenshot.getBitmapScreenshot(view, mPath));
Wie man angesichts der aktuellen Aktivität. Ich möchte nicht mit der id der xml.takeScreenshotForScreen()
statt.Wenn Sie möchten, nehmen screenshot aus
fragment
als Folge dieser:Überschreiben
onCreateView()
:Logik für die Aufnahme screenshot:
Methode
shareScreenShotM)()
:Methode takeScreenShot():
Methode savePic():
Für Aktivität können Sie einfach
View v1 = getWindow().getDecorView().getRootView();
stattmView
Nur die Erweiterung taraloca Antwort. Sie müssen hinzufügen, die folgenden Zeilen, damit es funktioniert. Ich habe die Bild-name statisch. Bitte stellen Sie sicher, verwenden taraloca die timestamp-variable incase Sie brauchen, dynamische image-name.
Und in der AndroidManifest.xml Datei folgende Einträge sind erforderlich:
Die parameter-Ansicht ist die root-layout-Objekt.
Meisten Antworten zu dieser Frage verwenden Sie die
Canvas
Zeichnung Methode oder Zeichnung cache-Methode. Jedoch, dieAnzuzeigen.setDrawingCache()
- Methode ist deprecated API-28. Derzeit ist die empfohlene API für die Erstellung von screenshots ist diePixelCopy
Klasse zur Verfügung aus der API-24 (aber die Methoden, die akzeptierenWindow
parameter sind verfügbar aus der API-26 == Android 8.0 Oreo). Hier ist ein Beispiel Kotlin-code zum abrufen einerBitmap
:Für system-Anwendungen nur!
Hinweis: System-Anwendungen, die nicht brauchen, um ausführen, "su", um diesen Befehl auszuführen.
Screenshot einer Ansicht in android.
Für Die Ganze Seite Scrollen Screenshot
Wenn Sie möchten, erfassen Sie eine vollständige Ansicht screenshot (enthält eine scrollview oder so) dann ein Häkchen an dieser Bibliothek
Alles, was Sie tun müssen ist, importieren Sie die Gradel, und erstellen Sie ein Objekt der BigScreenshot
BigScreenshot longScreenshot = new BigScreenshot(this, x, y);
Einen Rückruf erhalten mit der bitmap der Screenshots getroffen, während automatisch scrollen durch die Ansicht der Gruppe und am Ende zusammengebaut.
@Override public void getScreenshot(Bitmap bitmap) {}
Die gespeichert werden können, um die Galerie oder was auch immer die Nutzung ist notwendig, Ihren nach
wenn Sie möchten, erfassen Sie eine Ansicht oder layout wie RelativeLayout oder LinearLayout etc.
benutzen Sie einfach den code :
nun können Sie diese bitmap auf dem Gerät Aufbewahrung von :