java - para - manual de programacion android pdf
Obtener eventos del sistema operativo (1)
Trabajo en Windows, pero estoy atrapado aquí en Mac. Tengo el Canon SDK y he construido un contenedor JNA
sobre él. Funciona bien en Windows y necesita ayuda con Mac. En el SDK, hay una función donde se puede registrar una función de devolución de llamada. Básicamente, cuando ocurre un evento en la cámara, llama a la función de devolución de llamada.
En Windows, después de registrarme, necesito usar User32
para obtener el evento y enviar el evento de la siguiente manera:
private static final User32 lib = User32.INSTANCE;
boolean hasMessage = lib.PeekMessage( msg, null, 0, 0, 1 ); // peek and remove
if( hasMessage ){
lib.TranslateMessage( msg );
lib.DispatchMessage( msg ); //message gets dispatched and hence the callback function is called
}
En la API, no encuentro una clase similar en Mac. ¿Cómo voy sobre este?
PD: La API de JNA
para Unix es extensa y no pude encontrar qué buscar. La referencia podría ayudar
Esta solución está utilizando el marco de Cocoa. Cocoa está en desuso y no tengo conocimiento de ninguna otra solución alternativa. Pero el siguiente funciona como el encanto.
Finalmente encontré la solución usando Carbon
framework Carbon
. Aquí está mi interfaz MCarbon
que define las llamadas que necesito.
public interface MCarbon extends Library {
MCarbon INSTANCE = (MCarbon) Native.loadLibrary("Carbon", MCarbon.class);
Pointer GetCurrentEventQueue();
int SendEventToEventTarget(Pointer inEvent, Pointer intarget);
int RemoveEventFromQueue(Pointer inQueue, Pointer inEvent);
void ReleaseEvent(Pointer inEvent);
Pointer AcquireFirstMatchingEventInQueue(Pointer inQueue,NativeLong inNumTypes,EventTypeSpec[] inList, NativeLong inOptions);
//... so on
}
La solución al problema se resuelve con la siguiente función:
NativeLong ReceiveNextEvent(NativeLong inNumTypes, EventTypeSpec[] inList, double inTimeout, byte inPullEvent, Pointer outEvent);
Esto hace el trabajo. Según la documentación -
This routine tries to fetch the next event of a specified type.
If no events in the event queue match, this routine will run the
current event loop until an event that matches arrives, or the
timeout expires. Except for timers firing, your application is
blocked waiting for events to arrive when inside this function.
Además, si no es ReceiveNextEvent
, entonces otras funciones como las mencionadas en la clase MCarbon
anterior serían útiles.
Creo que la documentación del marco de Carbon
daría más ideas y flexibilidad para resolver el problema. Además de Carbon
, en foros la gente mencionó cómo resolver el uso de Cocoa
, pero no conozco ninguno.
Editar: Gracias a technomarge , más información aquí