J'ai un OnePlus One avec Cyanogen OS 12 enraciné et Tasker v4.8 . J'ai un script bash dans le PC qui, lorsqu'il sort, demande l'exécution d'une tâche de Tasker. J'ai vu la question Exécution d'une tâche de tasker via SSHDroid (ou adb shell) et bien que la réponse acceptée n'ait pas fonctionné sur mon Android, la solution est très simple. Pour appeler une tâche, faites :
adb shell su -c am broadcast -a net.dinglisch.android.tasker.ACTION_TASK --es "task_name" "TASK_NAME"
Cependant, c'est tout ce que je peux faire avec succès. Lors de la sortie, mon script doit transmettre l'état de sortie à la tâche afin que je puisse continuer mon traitement sur le dispositif en fonction du résultat du script.
El Guide officiel pour invoquer des tâches est destiné aux programmeurs, donc ça ne m'a pas aidé. Selon le fil de discussion Lancement de la tâche via l'intention J'ai essayé plusieurs façons de passer la valeur d'une variable, mais sans succès.
Lorsque nous invoquons une tâche à partir d'une autre tâche, nous avons la possibilité de transmettre des valeurs en utilisant deux variables. Ces deux variables peuvent être reçues par la tâche invoquée en utilisant le nom %par1
y %par2
. Dans ma tâche de démonstration, tout ce que je fais, c'est Alerte → Flash → Texte → Show me: %arg1 %par1
.
\# For demonstration only, I created a task named "lol"
adb shell su -c am broadcast -a net.dinglisch.android.tasker.ACTION\_TASK --es "task\_name" "lol" --es "varNames" "par1" --es "varValues" "received"
adb shell su -c am broadcast -a net.dinglisch.android.tasker.ACTION\_TASK --es "task\_name" "lol" --es "varNames" "%par1" --es "varValues" "received"
adb shell su -c am broadcast -a net.dinglisch.android.tasker.ACTION\_TASK --es "task\_name" "lol" --es "varNames" "Par1" --es "varValues" "received" # I also changed the variable name par1 to Par1 in task
adb shell su -c am broadcast -a net.dinglisch.android.tasker.ACTION\_TASK --es "task\_name" "lol" --es "varNames" "%Par1" --es "varValues" "received"
Toutes ces commandes s'exécutent avec cette sortie
Broadcasting: Intent { act=net.dinglisch.android.tasker.ACTION_TASK (has extras) }
Broadcast completed: result=0
Même l'envoi de cette diffusion fonctionne
adb shell su -c am broadcast -a net.dinglisch.android.tasker.ACTION_TASK -d "task:lol" --es "arg1" "received" # I setup a profile to listen to this intent and receive extra from it in a task linked to profile
Mais appeler directement la tâche et envoyer ensuite la valeur de la variable ne fait rien.
Alors, où est le problème dans mon approche et/ou comment puis-je envoyer et recevoir une valeur variable dans une tâche ? en utilisant uniquement la ligne de commande ?
Note que je ne cherche pas une solution de contournement. Je suis parfaitement capable de trouver de nombreuses solutions de contournement pour recevoir l'état de sortie de mon script sur le périphérique, mais l'utilisation de l'intention semble être la solution la plus simple d'entre elles et je veux aussi apprendre cette technique.
Update
J'ai soulevé ma question à :
- forums officiels - Tasker : Invoquer une tâche à partir de la ligne de commande et lui transmettre des variables et/ou des données
- subreddit Tasker : Peut-on passer des variables lorsqu'une tâche est appelée depuis une ligne de commande ?
- En privé, selon Pent, le développeur de Tasker, utiliser l'email
J'ai reçu la réponse suivante de Pent, à la fois par courriel et sur le forum
Il faudrait pouvoir ajouter un StringArrayList supplémentaire à l'appel adb avec -e, je ne sais pas si adb peut le faire.
Si oui, pour voir le format vous pouvez regarder TaskerIntent.java http://tasker.dinglisch.net/code/TaskerIntent.java , la fonction addLocalVariable, si vous comprenez java.
Et c'est exactement ce que J'ai supposé plus tard après avoir posté cette question.
Par la réponse aquí Je crois qu'un tableau de chaînes peut être transmis en utilisant adb. J'ai donc tenté quelques requêtes mais je me suis retrouvé dans une impasse.
adb shell su -c am broadcast -a net.dinglisch.android.tasker.ACTION\_TASK --es "task\_name" "lol" --es "varNames" '{"arg1"}' --es "varValues" '{"time"}'
adb shell su -c am broadcast -a net.dinglisch.android.tasker.ACTION\_TASK --es "task\_name" "lol" --es "varNames" '{"par1"}' --es "varValues" '{"time"}'
adb shell su -c am broadcast -a net.dinglisch.android.tasker.ACTION\_TASK --es "task\_name" "lol" --es "varNames" '{"par1"\\,"arg1"}' --es "varValues" '{"received"\\,"again"}'
J'ai également converti l'intention en URI en utilisant am to-intent-uri
et j'ai essayé d'envoyer l'URI d'intention directement, sans succès à nouveau.
Nouvelle mise à jour
Basé sur les lectures à savoir. 1 , 2 y 3 je suis absolument sûr qu'un tableau de chaînes de caractères peut être transmis par le biais de adb shell am
en utilisant --esa
argument. Exemple :
adb shell su -c am broadcast -a net.dinglisch.android.tasker.ACTION_TASK --esa "par" "lol, cat" # value lol goes in par1 variable and value cat goes in par2 variable
Cela dit, cette requête échoue toujours :
adb shell su -c am broadcast -a net.dinglisch.android.tasker.ACTION_TASK --es task_name "lol" --esa varNames "arg1, par1" --esa varValues "lol, cat"
Nouvelle mise à jour n°2
Vous pouvez utiliser la version stock d'Android 6.0.1 comme terrain d'essai.
0 votes
Je commence à penser que je dois passer des tableaux de chaînes de caractères et je n'ai aucune idée de la façon de procéder.
0 votes
Je ne suis pas sûr d'avoir bien lu, vous avez un script adb qui, une fois terminé, doit transmettre une variable à une tâche dans tasker, correct ? Mais la tâche dans le tasker ne reçoit pas cette variable, et vous voulez qu'elle reçoive la variable. Suis-je sur la bonne voie ?
0 votes
C'est un script bash, mais oui, à la fin je veux appeler une tâche en utilisant adb et lui envoyer une variable.
0 votes
D'accord, je posterai toute information utile si j'en trouve, et bonne chance.
0 votes
@pure.by : merci d'avoir suggéré cette alternative et oui, je peux l'utiliser, et j'ai utilisé une autre alternative pour résoudre le problème. J'ai posté cette question dans le but d'apprendre la méthode la plus courte pour atteindre l'objectif.