Si puòin teoria ma non si può sul telefono... lo fa sulla box
Si puòin teoria ma non si può sul telefono... lo fa sulla box
perchè c'e' questo pezzetto? CallSubDelayed(AccServ....
quindi entra in accserv e parte?
Con il rootSi può
success = acs.PerformNodeActionOnViewWithArgs(True, "android:id/icon_confirm", AccServConstants.ACTION_CLICK, Null)
? e come si fa?Con Accessibility service , te lho.scritto prima. Puoi cliccare simulando un tocco.
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
nodo.RunMethod("performAction", Array As Object(AccServConstants.ACTION_CLICK))
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);
}
usa la libreria SendInput ora la provocercando 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 implementarecercando 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" ??
mi sa che non funziona, guarda qui:usa la libreria SendInput ora la provo
A me funziona con inline Java. Non conosco sendinputmi sa che non funziona, guarda qui:
https://www.b4x.com/android/forum/t...nput-within-your-app.38873/page-2#post-942495
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)
#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
Dim jo As JavaObject
jo.InitializeContext
Dim flag As Boolean = jo.RunMethod("clickOnWindow", Array As Object(cx, cy))
obj.RunMethod("performAction", Array As Object(AccServConstants.ACTION_CLICK))
Comunque io ho sviluppato un app che esamina lo schermo e clicca sui bottoni di altre app e mi funziona.
Cosa intendi elementi non cliccabili?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