Autore Topic: Generare un Evento di sistema da un Service  (Letto 1546 volte)

Offline A2PLab

  • Nuovo arrivato
  • *
  • Post: 37
  • [Close The World - txeN ehT nepO]
  • Respect: +1
    • Google+
    • http://it.linkedin.com/in/giuseppemastroeni
    • a2plab
    • a2plab
    • Mostra profilo
    • A2PLab
  • Dispositivo Android:
    HTC Desire, Acer Iconia Tab a500
  • Sistema operativo:
    Ubuntu 11.04
Generare un Evento di sistema da un Service
« il: 28 Giugno 2010, 18:15:44 CEST »
0
Ciao ragazzi,

sto sviluppando una applicazione che riconosce dei gesti effettuati con un dispositivo Android sfruttando l'accelerometro. Un pò come funziona per i Wiimote per la wii ma ovviamente molto più perfomante  configurabile e preciso...ih ih  :-P
Per esempio Un movimento effettuato nello spazio, per esempio muovere la mano da destra a sinistra, corrisponde a un evento che chiamo LEFT.

Adesso, Volevo associare questi "eventi" riconosciuti dal mio sistema, ad eventi di sistema.
Per esempio, quando riconosco che viene riconosciuto l'evento LEFT voglio che sia come se avessi scrollato con il dito sul touchscreen oppure sulla trackball.

Il thread che riconosce i miei movimenti è un Service e volevo saper come fare all'interno di questa classe a generare un KeyEvent o un MotionEvent dato che ho visto che mi servono questi due tipi di oggetti.

Alle prime ricerche ho trovato qualcosa sulla classe Instrumentation, e sul metodo obtain() di MotionEvent, ma non ho ancora capito bene come usarli da un Service.

Qualcuno può essermi d'aiuto?
[Close The World - txeN ehT nepO]

Offline ScarfaceIII

  • Utente junior
  • **
  • Post: 112
  • Respect: +13
    • raferalston12
    • Mostra profilo
  • Dispositivo Android:
    Nexus One
  • Sistema operativo:
    GNU/Linux, Ubuntu 10.04 / Windows 7
Re:Generare un Evento di sistema da un Service
« Risposta #1 il: 28 Giugno 2010, 23:07:12 CEST »
0
Ciao, ho appena finito di sviluppare anche io un'applicazione che sfrutta l'accelerometro. Vorrei esserti d'aiuto in qualche modo ma prima vorrei meglio capire cosa vorresti fare: hai sviluppato un sistema per riconoscere le "gesture" dell'utente e genera degli "eventi". Ora vorresti tradurre questi eventi in azioni, se non erro. Ad esempio: scroll sul touchscreen e/o azione sulla trackball?

Per chiarezza, una cosa del genere: movimento del telefono verso destra -> evento RIGHT -> produzione dell'evento "touchscroll a destra", giusto?

Se la parte di riconoscimento della gesture a partire dalla lettura dei sensori accelerometrici è già fatta (e per esperienza personale, volendo fare una cosa fatta bene, è la più difficile), allora sei già a cavallo. Non ho al momento conoscenza sulle classi che governano touchscreen e trackball, ma a mio avviso non penso sia difficile interagirci. Inoltre, se posso suggerire, potresti utilizzare direttamente l'evento che generi per modificare la tua interfaccia, a seconda di quello che desideri venga fatto. Per capirci: evento RIGHT -> azione diretta sulla UI (attraverso i metodi offerti da View e figli...)

Fammi sapere se ho centrato il problema e sono stato utile o in caso negativo, cosa non ho capito ;)

Offline A2PLab

  • Nuovo arrivato
  • *
  • Post: 37
  • [Close The World - txeN ehT nepO]
  • Respect: +1
    • Google+
    • http://it.linkedin.com/in/giuseppemastroeni
    • a2plab
    • a2plab
    • Mostra profilo
    • A2PLab
  • Dispositivo Android:
    HTC Desire, Acer Iconia Tab a500
  • Sistema operativo:
    Ubuntu 11.04
Re:Generare un Evento di sistema da un Service
« Risposta #2 il: 29 Giugno 2010, 10:48:36 CEST »
0
Hai capito tutto perfettamente.

Il sistema di riconoscimento è già implementato, è una rete neurale che viene addestrata e poi riconosce i movimenti preregistrati e da la possibilità di registrarne altri.

Quello che mi manca è scatenare l'evento dello scroll dello schermo o di un tasto del device o un evento touch.
Li so intercettare ma non non li so generare. Però non mi interessa gestire una view in particolare, ma la view attiva in quel momento.

Per esempio,
Se sto guardando le foto, voglio scrollarle con i movimenti del tel, se sto guardando un listview voglio scrollarla spostando il telefono aventi e indietro e selezionare un elemento dando un "colpettino" verso il basso.

Questo metodo poi voglio usarlo anche gestire il pc in stile Gmote ma con l'uso dell'accelerometro.
[Close The World - txeN ehT nepO]

Offline blackgin

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1387
  • Respect: +164
    • Google+
    • blackgins
    • blackginsoft
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Sistema operativo:
    Mac OSX 10.8
Re:Generare un Evento di sistema da un Service
« Risposta #3 il: 29 Giugno 2010, 10:56:01 CEST »
0
Per la gestione del pc diciamo che é "facile" perché tu invii gli eventi al tuo pc, un server che tu hai programmato li riconosce e li traduce in quello che vuoi.
Per android in teoria sarebbe simile la cosa, peró non so effettivamente se si possano generare eventi di questo tipo, con questo grado di controllo.
Postate il LogCat LogCat LogCat LogCat LogCat

Offline A2PLab

  • Nuovo arrivato
  • *
  • Post: 37
  • [Close The World - txeN ehT nepO]
  • Respect: +1
    • Google+
    • http://it.linkedin.com/in/giuseppemastroeni
    • a2plab
    • a2plab
    • Mostra profilo
    • A2PLab
  • Dispositivo Android:
    HTC Desire, Acer Iconia Tab a500
  • Sistema operativo:
    Ubuntu 11.04
Re:Generare un Evento di sistema da un Service
« Risposta #4 il: 29 Giugno 2010, 11:01:40 CEST »
0
Per la gestione del pc diciamo che é "facile" perché tu invii gli eventi al tuo pc, un server che tu hai programmato li riconosce e li traduce in quello che vuoi.
Per android in teoria sarebbe simile la cosa, peró non so effettivamente se si possano generare eventi di questo tipo, con questo grado di controllo.

eh eh...lo so che è facile, infatti è un passo successivo.
A meno che vedo che su android è un pò troppo complicato e per adesso sposto la cosa solo su pc e uso il device come "telecomando"
[Close The World - txeN ehT nepO]

Offline ScarfaceIII

  • Utente junior
  • **
  • Post: 112
  • Respect: +13
    • raferalston12
    • Mostra profilo
  • Dispositivo Android:
    Nexus One
  • Sistema operativo:
    GNU/Linux, Ubuntu 10.04 / Windows 7
Re:Generare un Evento di sistema da un Service
« Risposta #5 il: 29 Giugno 2010, 11:20:46 CEST »
0
Ok, allora ci siamo. Penso che il problema che incontri è (vediamo di spiegarci in italiano...) che vuoi generare un evento che su Android è generato dai sensori (di touchscreen e trackball) ed è normale che tu riesca a intercettarli ma non a generarli. Intendo dire che quello che faresti in questo modo è una sorta di "emulazione" del sensore sul touchscreen, mentre invece devi ricreare tu l'azione che accadrebbe per esempio passando il dito da destra a sinistra sullo schermo.

Tornando all'esempio che riporti: se vuoi fare scroll di una foto con l'accelerometro, la sequenza che vorresti ottenere è:  il tuo sistema riconosce l'evento LEFT, che, a sua volta scatena (emulando) un evento X del touchscreen, al quale corrisponde il cambio di foto. Quel che ti consiglio io è di implementare direttamente il cambio di foto, scatenato dal tuo evento LEFT. Come ti suggerivo, attraverso i metodi della classe View si possono fare tutte ste cose.

Spero di essermi spiegato, ma ti riporto un esempio della mia applicazione, per farmi capire: la mia applicazione è una specie di telecomando tramite accelerometro. Per dare un feedback all'utente e fargli capire quello che sta facendo, nella schermata di guida ho una pallina che si muove a seconda di come si inclina il telefono.
Secondo la tua soluzione, da quel che capisco, avrei dovuto riconoscere il movimento del telefono, generare l'evento di movimento, generare un evento di touchscreen e muovere la pallina con l'evento di touchscreen, emulando il movimento del dito dell'utente sullo schermo.
In realtà quello che ho fatto è stato muovere la pallina con View.layout() in base al movimento rilevato dagli accelerometri.

E' una cosa un po' complicata da spiegare per iscritto ma spero di averti capito e di essermi spiegato.

Offline A2PLab

  • Nuovo arrivato
  • *
  • Post: 37
  • [Close The World - txeN ehT nepO]
  • Respect: +1
    • Google+
    • http://it.linkedin.com/in/giuseppemastroeni
    • a2plab
    • a2plab
    • Mostra profilo
    • A2PLab
  • Dispositivo Android:
    HTC Desire, Acer Iconia Tab a500
  • Sistema operativo:
    Ubuntu 11.04
Re:Generare un Evento di sistema da un Service
« Risposta #6 il: 29 Giugno 2010, 11:53:48 CEST »
0
Grazie dei consigli.
Ti sei spiegato benissimo.

i tuoi consigli sono molto utili ma non è quello che cerco. io voglio poter generare gli eventi a prescindere dalla view o dalla activity che ho attiva in un determinato momento. E generare i miei eventi a basso livello.

Se faccio LEFT, deve essere LEFT in qualsiasi momento. Per esempio, se faccio DOWN voglio che corrisponda al click della trackball, ma a prescindere dall'applicazione aperta.

Mi hai fatto venire in mente una cosa però, esiste un modo per sapere da un Service quale è la Activity o la view attiva?
Se si potesse fare potrei fare come dici e invece di uscire pazzo chiamare i metodi che dici sulla view attiva.
[Close The World - txeN ehT nepO]

Offline ScarfaceIII

  • Utente junior
  • **
  • Post: 112
  • Respect: +13
    • raferalston12
    • Mostra profilo
  • Dispositivo Android:
    Nexus One
  • Sistema operativo:
    GNU/Linux, Ubuntu 10.04 / Windows 7
Re:Generare un Evento di sistema da un Service
« Risposta #7 il: 29 Giugno 2010, 12:15:50 CEST »
0
Activity. Il lifecycle è il modo in cui puoi trovare quel che cerchi:
Ovviamente, la View attiva, sarà quella associata all'Activity in primo piano...

 :-o :-o :-o A meno che la tua applicazione non abbia assolutamente GUI e tu voglia comandare una qualsiasi activity che venga lanciata dopo il lancio del tuo servizio...forse comincio a capire quel che vuoi fare e perché ti serve "emulare" touchscreen e trackball.
In questo caso la cosa si complica...mi ritiro per deliberare...  o_O


Offline blackgin

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1387
  • Respect: +164
    • Google+
    • blackgins
    • blackginsoft
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Sistema operativo:
    Mac OSX 10.8
Re:Generare un Evento di sistema da un Service
« Risposta #8 il: 29 Giugno 2010, 13:39:57 CEST »
0
Esatto scarface. Io credo che lui voglia avere la possibilitá di controllare gli eventi del touchscreen con la sua app in background. Eventi su qualsiasi activity. Per questo credo che le api non permettano un controllo cosí elevato.
Postate il LogCat LogCat LogCat LogCat LogCat

Offline A2PLab

  • Nuovo arrivato
  • *
  • Post: 37
  • [Close The World - txeN ehT nepO]
  • Respect: +1
    • Google+
    • http://it.linkedin.com/in/giuseppemastroeni
    • a2plab
    • a2plab
    • Mostra profilo
    • A2PLab
  • Dispositivo Android:
    HTC Desire, Acer Iconia Tab a500
  • Sistema operativo:
    Ubuntu 11.04
Re:Generare un Evento di sistema da un Service
« Risposta #9 il: 29 Giugno 2010, 13:44:23 CEST »
0
:-o :-o :-o A meno che la tua applicazione non abbia assolutamente GUI e tu voglia comandare una qualsiasi activity che venga lanciata dopo il lancio del tuo servizio...forse comincio a capire quel che vuoi fare e perché ti serve "emulare" touchscreen e trackball.
In questo caso la cosa si complica...mi ritiro per deliberare...  o_O

Esatto! ho una interfaccia che serve per la configurazione e inserimento nuovi gesti, dopodichè avvio un servizio che si occupa del riconoscimento a prescindere da tutto.

Comunque:
stamattina parlando con il professore abbiamo deciso di orientare la cosa alla domotica. Quindi gli eventi dovranno essere inviati a un dispositivo esterno, il problema per adesso non lo più.
Ma, dato che questa applicazione la vorrei continuare dopo la laurea, e svilupparla per l'uso ANCHE di Android oltre che di un Pc o qualsiasi cosa riesco a trovare di carino, il problema rimane! :-\

Come ho detto nel primo messaggio credo che bisogno usare la classe Instrumentation, ma documentandomi meglio ho visto che viene usato soprattutto per "testare" tramite comandi shell , il funzionamento degli strumenti del device.

ho fatto qualche prova a usarlo "a modo mio", cioè integrandolo nell'applicazione, e stavo arrivando a qualcosa, ma adesso tralascerò dati i cambiamenti di programma.

grazie CMQ!
[Close The World - txeN ehT nepO]

Offline ScarfaceIII

  • Utente junior
  • **
  • Post: 112
  • Respect: +13
    • raferalston12
    • Mostra profilo
  • Dispositivo Android:
    Nexus One
  • Sistema operativo:
    GNU/Linux, Ubuntu 10.04 / Windows 7
Re:Generare un Evento di sistema da un Service
« Risposta #10 il: 29 Giugno 2010, 13:55:34 CEST »
0
Di niente figurati! Idea interessante la tua, cmq. Purtroppo non saprei come aiutarti per quanto riguarda l'interazione con Android stesso, perché, pensandoci, non so se l'idea di replicare un evento "touch" o "trackball", sia la strada corretta, poiché il tipo di azione conseguente dipenderà da applicazione ad applicazione in quanto cosa corrisponde a tale evento è a discrezione del programmatore e non so se Google stessa è stata coerente in tutte le sue applicazioni. Sarebbe difficile da parte tua predire il comportamento delle varie applicazioni, in quanto quel che succede non è in tuo potere, non credi?

La soluzione domotica è più "semplice" in quanto sei tu a definire il comportamento ed essendo fondamentalmente la tua preoccupazione principale, puoi curarla in tutti i particolari. Il virgolettato è necessario perché è semplice risolvere i problemi in quanto sono in tuo potere, ma non è detto che sia veramente semplice! :D

Offline A2PLab

  • Nuovo arrivato
  • *
  • Post: 37
  • [Close The World - txeN ehT nepO]
  • Respect: +1
    • Google+
    • http://it.linkedin.com/in/giuseppemastroeni
    • a2plab
    • a2plab
    • Mostra profilo
    • A2PLab
  • Dispositivo Android:
    HTC Desire, Acer Iconia Tab a500
  • Sistema operativo:
    Ubuntu 11.04
Re:Generare un Evento di sistema da un Service
« Risposta #11 il: 29 Giugno 2010, 15:46:47 CEST »
0
Citazione
Sarebbe difficile da parte tua predire il comportamento delle varie applicazioni, in quanto quel che succede non è in tuo potere, non credi?

Infatti io vorrei simulare gli eventi di sistema e non quelli della applicazione.

Per esempio ho fatto in .NET una classe che intercetta la pressione dei tasti della tastiera a prescindere da quale applicazione ha il focus.
In questo modo se ho assegnato al tasto SHIFT che si deve aprire VLC anche se sono su Firefox o su winamp mi si apre vlc. (Esempio poco credibile ma esplicativo ;-))

Qui invece si tratta di dire al sistema "vedi che c'è stato un click" e poi il sistema invia all'applicazione l'evento corrispondete e l'applicazione lo gestisce come meglio crede.
Consideriamo comunque che o scroll sullo schermo(qualche dubbio) come l'uso della trackball come il pulsante indietro prescindono dall'applicazione e hanno lo stesso funzionamento in tutto il sistema.

In tutto ciò, rimane il fatto che a questo punto ho seri dubbi sul fatto che sia possibile fare una cosa del genere tranne usando la classe Instrumentation, ma purtroppo, a quanto ho capito, serve solo per effettuare dei test sul dispositivo in questione. Anche se si potrebbero trovare degli usi alternativi, ed è quello che volevo fare.
Per adesso mi dedico alla tesi! Farò sicuramente altri Post man mano che incotro problemi! :-[

Grazie in ogni caso della discussione interessante :-P
[Close The World - txeN ehT nepO]