German Screenshot von eigener App

so27

Active Member
Licensed User
Longtime User
Hallo zusammen,

ich versuche über den folgenden Code ein Screenshot von meinem geöffneten Activity zu machen. Scheinbar wird das Screenshot aber nicht angelegt. Hat jemand eine Idee?

B4X:
    Dim Obj1, Obj2 As Reflector
    Dim bmp As Bitmap
    Dim c As Canvas
    Obj1.Target = Obj1.GetActivityBA
    Obj1.Target = Obj1.GetField("vg")
    bmp.InitializeMutable(Activity.Width, Activity.Height)
    c.Initialize2(bmp)
    Dim args(1) As Object
    Dim types(1) As String
    Obj2.Target = c
    Obj2.Target = Obj2.GetField("canvas")
    args(0) = Obj2.Target
    types(0) = "android.graphics.Canvas"
    Dim Out As OutputStream
    Out = File.OpenOutput(File.DirInternal, "dateiname.png", False)
    bmp.WriteToStream(Out, 100, "PNG")
    Out.Close
 

DonManfred

Expert
Licensed User
Longtime User
Wo genau wird der Code denn aufgerufen? Durch einen Button ausgelöst?

Tipp: Vermulich einfach eine Sub mit diesem Code erstellen und diese dann zeitversetzt aufrufen.
Also nicht in activity create machen...
 

so27

Active Member
Licensed User
Longtime User
Ja, ich rufe den Code durch einen Button auf. Ich versuche es mal zeitversetzt.
 

Alexander Stolte

Expert
Licensed User
Longtime User
Out = File.OpenOutput(File.DirInternal, "dateiname.png", False)
Wenn du es im Ordner suchst oder in der Gallery, dann kannst du lange suchen, da "File.DirInternal" es im Internen Speicher der App ablegt. Da der Code richtig ist, denke ich mal das es daran liegt. Probiere es mal mit "File.DirRootExternal".
 

so27

Active Member
Licensed User
Longtime User
Wenn du es im Ordner suchst oder in der Gallery, dann kannst du lange suchen, da "File.DirInternal" es im Internen Speicher der App ablegt. Da der Code richtig ist, denke ich mal das es daran liegt. Probiere es mal mit "File.DirRootExternal".

Das ist mir klar. Leider kann ich die Datei nicht aufrufen, da sie an dem angegebenen Ort nicht existiert.
 

so27

Active Member
Licensed User
Longtime User
Ich speicher in File.DirRootExternal. Nachdem ich das SDK auf 22 gesenkt hatte, wird die Datei auch angelegt. Bei SDK 23 muss ich erst noch die Berechtigungen einbauen.

Jetzt ist es allerdings so, dass die Datei angelegt wird, das Bild ist aber nur schwarz. Woran kann das liegen?
 

klaus

Expert
Licensed User
Longtime User
Wenn Du Codesnippets kopierst musst Du sie komplett kopieren.
In deinem fehlt diese Zeile Obj1.RunMethod4("draw", args, types) :
B4X:
Sub btnScreenshot_Click
    Private Obj1, Obj2 As Reflector
    Private bmp As Bitmap
    Private c As Canvas
   
    Obj1.Target = Obj1.GetActivityBA
    Obj1.Target = Obj1.GetField("vg")
   
    bmp.InitializeMutable(Activity.Width, Activity.Height)
    c.Initialize2(bmp)
   
    Private args(1) As Object
    Private types(1) As String
    Obj2.Target = c
    Obj2.Target = Obj2.GetField("canvas")
    args(0) = Obj2.Target
    types(0) = "android.graphics.Canvas"
    Obj1.RunMethod4("draw", args, types) ' diese Zeile fehlt in deinem Code
   
    Private Out As OutputStream
    Out = File.OpenOutput(File.DirRootExternal, "dateiname.png", False)
    bmp.WriteToStream(Out, 100, "PNG")
    Out.Close
End Sub
 

so27

Active Member
Licensed User
Longtime User
Wenn Du Codesnippets kopierst musst Du sie komplett kopieren.
In deinem fehlt diese Zeile Obj1.RunMethod4("draw", args, types) :

Okay, vielen Dank. Jetzt klappt es. Übrigens in meiner Quelle fehlte diese Zeile.
 
Top