Italian Gestione USB e alimentazione

Star-Dust

Expert
Licensed User
Longtime User
Con Accessibility service , te lho.scritto prima. Puoi cliccare simulando un tocco.
 

sirjo66

Well-Known Member
Licensed User
Longtime User
una volta che la schermata di spegnimento appare, ecco la lista degli oggetti che sono presenti:

android:id/icon_confirm
android:id/icon
android:id/icon_safemode
android:id/message
android:id/status
android:id/icon_confirm
android:id/icon
android:id/message
android:id/status
android:id/icon
android:id/message
android:id/status
android:id/animated_status

se vedete ci sono tre gruppi di:
android:id/icon_confirm
android:id/icon
android:id/message
android:id/status

sul primo gruppo il message.text vale "Spegni", il secondo vale "Riavvia", il terzo "Modalità di emergenza" (almeno sul telefono che sto provando con Android 8)

se devo dare ora il comando
B4X:
success = acs.PerformNodeActionOnViewWithArgs(True, "android:id/icon_confirm", AccServConstants.ACTION_CLICK, Null)
come fa il sistema a capire su quale dei tre deve fare CLICK ?

Del primo "icon" posso ricavarmi le coordinate a video, non ci sono problemi, poi ho visto che si pò fare click usando le coordinate dello schermo, ma non sono riuscito a trovare il codice di esempio

Partendo da qui

https://developer.android.com/reference/android/view/accessibility/AccessibilityNodeInfo

ho trovato che, una volta scelto il nodo (e quindi la prima icona "spegni") si può chiamare il metodo performAction() e fargli fare il click

solo che con JavaObject e Reflector non ci capisco nulla
 
Last edited:

Star-Dust

Expert
Licensed User
Longtime User
Mica posso fare tutto io. E poi sono in spiaggia. Nel forum trovi come fare il click del mouse.
C'è mi pare un esempio di @moster67
 

sirjo66

Well-Known Member
Licensed User
Longtime User
Partendo da qui

https://developer.android.com/reference/android/view/accessibility/AccessibilityNodeInfo

ho trovato che, una volta scelto il nodo (e quindi la prima icona "spegni") si può chiamare il metodo performAction() e fargli fare il click

solo che con JavaObject e Reflector non ci capisco nulla

Ok, sono riuscito ad accedere all'oggetto "Event" e anche all'oggetto "Node" tramite JavaObject e ad accedere ai metodi, e analizzando meglio la schermata AccServConstants.GLOBAL_ACTION_POWER_DIALOG, sembra che non ci sia nemmeno un nodo che sia isClickable()
Che sia stato fatto di proposito ??
Ho provato infatti a fare CLICK sulle imageView tramite
B4X:
nodo.RunMethod("performAction", Array As Object(AccServConstants.ACTION_CLICK))
ma ovviamente non succede nulla e il telefono non si spegne
 

Star-Dust

Expert
Licensed User
Longtime User
Devi usare il click su coordinate .... ho detto troppo......
 

sirjo66

Well-Known Member
Licensed User
Longtime User
cercando un po' in giro mi sembra di aver capito che bisogna usare le dispatchGesture ed ho trovato questo piccolo esempio:

B4X:
public static GestureDescription click(float x, float y) {
    // for a single tap a duration of 1 ms is enough
    final int DURATION = 1;

    Path clickPath = new Path();
    clickPath.moveTo(x, y);
    GestureDescription.StrokeDescription clickStroke =
            new GestureDescription.StrokeDescription(clickPath, 0, DURATION);
    GestureDescription.Builder clickBuilder = new GestureDescription.Builder();
    clickBuilder.addStroke(clickStroke);
    return dispatchGesture(clickBuilder.build(), null, null);
}

devo tradurlo tutto in B4A utilizzando le JavaObject o a questo punto mi conviene di più un "inline java code" ??
 
Last edited:

Fulvio75

Well-Known Member
Licensed User
cercando un po' in giro mi sembra di aver capito che bisogna usare le dispatchGesture ed ho trovato questo piccolo esempio:

B4X:
public static GestureDescription click(float x, float y) {
    // for a single tap a duration of 1 ms is enough
    final int DURATION = 1;

    Path clickPath = new Path();
    clickPath.moveTo(x, y);
    GestureDescription.StrokeDescription clickStroke =
            new GestureDescription.StrokeDescription(clickPath, 0, DURATION);
    GestureDescription.Builder clickBuilder = new GestureDescription.Builder();
    clickBuilder.addStroke(clickStroke);
    return dispatchGesture(clickBuilder.build(), null, null);
}

devo tradurlo tutto in B4A utilizzando le JavaObject o a questo punto mi conviene di più un "inline java code" ??
usa la libreria SendInput ora la provo
 

Star-Dust

Expert
Licensed User
Longtime User
cercando un po' in giro mi sembra di aver capito che bisogna usare le dispatchGesture ed ho trovato questo piccolo esempio:

B4X:
public static GestureDescription click(float x, float y) {
    // for a single tap a duration of 1 ms is enough
    final int DURATION = 1;

    Path clickPath = new Path();
    clickPath.moveTo(x, y);
    GestureDescription.StrokeDescription clickStroke =
            new GestureDescription.StrokeDescription(clickPath, 0, DURATION);
    GestureDescription.Builder clickBuilder = new GestureDescription.Builder();
    clickBuilder.addStroke(clickStroke);
    return dispatchGesture(clickBuilder.build(), null, null);
}

devo tradurlo tutto in B4A utilizzando le JavaObject o a questo punto mi conviene di più un "inline java code" ??
In line java è una buona soluzione è soprattutto veloce da implementare
 

sirjo66

Well-Known Member
Licensed User
Longtime User
Ho provato sia il metodo JavaObject sia il metodo Inline Java Code, ma entrambe non funzionano :(
Mi sono ricavato le coordinate del pulsante "Spegni", e mi sono calcolato il punto centrale (su cx e cy)

Poi ho tradotto il codice in

B4X:
            Dim clickPath As JavaObject
            clickPath.InitializeNewInstance("android.graphics.Path", Null)
            clickPath.RunMethod("moveTo",Array As Object(cx, cy))

            Dim startTime As Long = 0
            Dim duration As Long = 10
            Dim clickStroke As JavaObject
            clickStroke.InitializeNewInstance("android.accessibilityservice.GestureDescription.StrokeDescription", Array As Object(clickPath, startTime, duration))
            
            Dim clickBuilder As JavaObject
            clickBuilder.InitializeNewInstance("android.accessibilityservice.GestureDescription.Builder", Null)
            clickBuilder.RunMethod("addStroke", Array As Object(clickStroke))
            
            Dim gestureDescription As JavaObject
            gestureDescription = clickBuilder.RunMethodJO("build", Null)
            
            Dim accServ As JavaObject
            accServ.InitializeContext
            Dim ok As Boolean
            ok = accServ.RunMethod("dispatchGesture", Array As Object(gestureDescription, Null, Null)).As(Boolean)

alla fine la variabile ok = True ma sul telefono il pulsante non viene premuto

Ho provato anche il Inline Java Code ma niente da fare.
Ho definito la routine
B4X:
#If JAVA
public boolean clickOnWindow(float x, float y) {
    // for a single tap a duration of 1 ms is enough
    final int DURATION = 1;

    android.graphics.Path clickPath = new android.graphics.Path();
    clickPath.moveTo(x, y);
    android.accessibilityservice.GestureDescription.StrokeDescription clickStroke =
            new android.accessibilityservice.GestureDescription.StrokeDescription(clickPath, 0, DURATION);
    android.accessibilityservice.GestureDescription.Builder clickBuilder = new android.accessibilityservice.GestureDescription.Builder();
    clickBuilder.addStroke(clickStroke);
    return dispatchGesture(clickBuilder.build(), null, null);
}
#End If

e poi chiamata così:
B4X:
            Dim jo As JavaObject
            jo.InitializeContext
            Dim flag As Boolean = jo.RunMethod("clickOnWindow", Array As Object(cx, cy))

anche stessa cosa, la variabile "flag" è true ma sul telefono nessun segno di vita
 

Star-Dust

Expert
Licensed User
Longtime User
Arrivato i permessi e le autorizzazioni?

Comunque io ho sviluppato un app che esamina lo schermo e clicca sui bottoni di altre app e mi funziona.
Purtroppo non posso divulgare il sorgente
 

sirjo66

Well-Known Member
Licensed User
Longtime User
se provo a cliccarci sopra usando
B4X:
obj.RunMethod("performAction", Array As Object(AccServConstants.ACTION_CLICK))
funziona perfettamente, per cui presumo che permessi e autorizzazioni ci sono

io sono riuscito a spegnere completamente il telefono senza l'intervento dell'utente, ma mi piacerebbe anche capire come fare un tocco qualsiasi sullo schermo in modo da avere in mano tutte le possibilità

preparo un piccolo progetto ??
 

Star-Dust

Expert
Licensed User
Longtime User
Non sono sicuro di aver capito cosa vuoi fare
 

sirjo66

Well-Known Member
Licensed User
Longtime User
in alcune mie app utilizzo "accessibility service" per automatizzare certe procedure (ad esempio l'invio di messaggi tramite whatsapp) senza l'intervento dell'utente.
Finora non ho mai avuto grosse difficoltà e le app funzionano, ma quando ho visto questo thread di @Fulvio75 mi sono reso conto che potrei incontrare schermate dove potrebbero esserci degli oggetti che non cliccabili e quindi, in previsione di ciò, mi piacerebbe capire come eventualmente risolvere il problema con un touch in un punto preciso dello schermo

Comunque io ho sviluppato un app che esamina lo schermo e clicca sui bottoni di altre app e mi funziona.

Si, questo l'ho fatto anche io, a me serviva farlo su elementi non cliccabili
 

Star-Dust

Expert
Licensed User
Longtime User
in alcune mie app utilizzo "accessibility service" per automatizzare certe procedure (ad esempio l'invio di messaggi tramite whatsapp) senza l'intervento dell'utente.
Finora non ho mai avuto grosse difficoltà e le app funzionano, ma quando ho visto questo thread di @Fulvio75 mi sono reso conto che potrei incontrare schermate dove potrebbero esserci degli oggetti che non cliccabili e quindi, in previsione di ciò, mi piacerebbe capire come eventualmente risolvere il problema con un touch in un punto preciso dello schermo



Si, questo l'ho fatto anche io, a me serviva farlo su elementi non cliccabili
Cosa intendi elementi non cliccabili?
Io effettuo click non solo su Viste con Eventi , ad esempio bottoni, ma click su coordinate.
 
Top