A través de los servicios broker.location.*, se tiene acceso y control del gps utilizado en el dispositivo.

Interaccion con GPS

Mat|r proporciona el tipo de dato Location como un modelo integrado:

Model Location {
  Double latitude
  Double longitude
}

junto con un conjunto de servicios, nucleados dentro del namespace location, a utilizarse invocando broker.location.* desde el Mat|r script.

METODOS PUBLICOS

Bool broker.location.hasGPS()

Retorna
Bool Retorna true si el dispositivo tiene GPS, false caso contrario.

Bool broker.location.hasGPSAccess()

Retorna
Bool Retorna true si el usuario aceptó dar permisos de location a la app, false caso contrario o si no tiene GPS. En la primera vez que se ejecuta el método se consulta al usuario SI desea dar permisos.

void broker.location.start()

Inicia el servicio de location manager nativo. En la primera vez que se ejecuta el método se consulta al usuario si desea dar permisos, por éxito se inicia el servicio, por falla se lanza excepción. Ejecutar el método start() mas de una vez, no lanza exception. El método es bloqueante hasta que el usuario se acepte o niegue el permiso.

Excepciones
DeviceWithoutGPS – The device has no GPS enable. El dispositivo NO tiene gps o se encuentra desactivado.
LocationServiceAccessDenied – Error trying to access GPS without permission. El usuario NO ha dado permisos de uso del GPS.

void broker.location.stop()

Detiene el servicio de location manager nativo. Si se ejecuta el método stop() mas de una vez, no lanza exception. Si se quiere ejecutar el método stop() sin antes haber llamado al método start(), tampoco se lanza excepción.

Excepciones
DeviceWithoutGPS – The device has no GPS enable. El dispositivo NO tiene gps o se encuentra desactivado.
LocationServiceAccessDenied – Error trying to access GPS without permission. El usuario NO ha dado permisos de uso del GPS.

Bool broker.location.isReady()

Retorna
Bool Retorna true si el servicio ya obtuvo alguna actualización de posición válida, i.e., la llamada getLocation() devolverá un Location inmediatamente.
Excepciones
DeviceWithoutGPS – The device has no GPS enable. El dispositivo NO tiene gps o se encuentra desactivado.
LocationServiceAccessDenied – Error trying to access GPS without permission. El usuario NO ha dado permisos de uso del GPS.

Location broker.location.getLocation()

Obtiene y devuelve la posición actual obtenida del GPS del dispositivo. La llamada es bloqueante hasta que el servicio consigue una posición válida o termina por timeout arrojando una excepción. Durante el tiempo que demore en contestar se visualizará un “Loading” similar al que se tiene en la espera de llamada a un servicio.

Retorna
Location Este método devuelve un modelo Location de la posición obtenida por el GPS.
Excepciones
DeviceWithoutGPS – The device has no GPS enable. El dispositivo NO tiene gps o se encuentra desactivado.
LocationServiceAccessDenied – Error trying to access GPS without permission. El usuario NO ha dado permisos de uso del GPS.
LocationServiceNotStarted – The service location is stopped. No se inicializó el servicio llamando a start() previamente.
BrokerServiceTimeout – Timeout when executing broker service: ‘getLocation’ Time out esperando un location.

Ejemplo:

Experience MyLocation {
    Decision startBtn action("MainContext.hasGPS") label("HAS GPS?")
    Decision getLocation action("MainContext.getLocation") label("GET USER LOCATION")
}

Application {
   onInit {
        try {
            broker.location.start()
        } catch (e) {
            broker.ui.showAlert("Error", e.reason())
        }
    }
}

RuleContext MainContext {

    Rule hasGPS {
        try {
            Bool hasGPS = broker.location.hasGPS()
            broker.ui.showAlert("Location", "Has GPS: " + hasGPS.toString())
        } catch (e) {
            broker.ui.showAlert("Error", e.reason())
        }
    }

    Rule getLocation {
        try {
            Location userLoc = broker.location.getLocation()
            broker.ui.showAlert("Location", "(" + userLoc.latitude + ","+ userLoc.longitude + ")")
        } catch (e) {
            broker.ui.showAlert("Error", e.reason())
        }
    }
}