2013-04-16 18 views
8

Posso usare Javascript in modo multipiattaforma per ottenere la direzione della bussola in iOS e Android (con Chrome), senza utilizzare qualcosa come PhoneGap? So che iOS ha DeviceOrientationEvent, ma non riesco a trovare alcun equivalente su Chrome per Android.Posso usare Javascript per ottenere la direzione della bussola per iOS e Android?

+1

C'è una [API Web Compass] (http://dev.w3.org/2009/dap/system-info/compass.html). Non conosco il supporto del browser, ma puoi provare ad accedere a 'getCurrentOrientation' in ambito globale e vedere se è lì. Potresti anche provare con il prefisso 'webkit'. In bocca al lupo! – Mohsen

risposta

7

Sì, è possibile! Sfortunatamente il alpha non funziona su iPhone/iPad. Con Mobile Safari, alpha si basa sulla direzione in cui il dispositivo puntava quando è stato richiesto per la prima volta l'orientamento del dispositivo. Il kit web incluso ti offre la direzione della bussola. Per farlo funzionare per tutti gli altri browser (che tutti i supporti alpha come compassheading) è possibile utilizzare il seguente codice JavaScript:

if (window.DeviceOrientationEvent) { 
    // Listen for the deviceorientation event and handle the raw data 
    window.addEventListener('deviceorientation', function(eventData) { 
    var compassdir; 

    if(event.webkitCompassHeading) { 
     // Apple works only with this, alpha doesn't work 
     compassdir = event.webkitCompassHeading; 
    } 
    else compassdir = event.alpha; 
    }); 
} 

Android supporta anche Webkit, così sarebbe anche usare event.webkitCompassHeading, ma va bene.

BTW: "oncompassneedscalibration" non è supportato anche per iPhone e iPad.

+0

'' event.alpha'' non è sufficiente per ottenere un'intestazione bussola, '' alpha'' è solo la rotazione z di un dispositivo sul proprio asse (vedi http://w3c.github.io/deviceorientation/spec-source-orientation.html#rotations). Tuttavia, è possibile tradurre alpha, beta e gamma in una bussola; vedere la risposta di @richt qui sotto. – davidjb

+2

@davidjb: la tua risposta potrebbe confondere i lettori senza alcuna spiegazione e l'esempio di richt è anche relativo al canale alfa. Ecco un esempio visivo che mostra che il canale alfa è correlato all'orientamento orizzontale dalla vista titolare: https://dev.opera.com/articles/w3c-device-orientation-api/ Ciò che probabilmente volevi dire: In caso di utilizzando solo il canale alfa per la direzione della bussola è necessario tenere il telefono in orizzontale e in modalità verticale per un uso corretto. Altrimenti il ​​telefono potrebbe perdere il suo orientamento e non mostrare la direzione corretta. – Jonny

11

Come primer si dovrebbe rivedere this previous related StackOverflow answer e avere familiarità con il generale practical considerations for using DeviceOrientation Events nelle applicazioni web.

La soluzione semplice che ho fornito in my previous related StackOverflow answer applica solamente ai browser che implementano absolute eventi deviceorientation (cioè dove il browser deviceorientation alpha proprietà è bussola -oriented). Ciò significa che la soluzione fornita al momento funziona solo nei browser Android e non nei browser basati su iOS o in qualsiasi altro browser che non fornisce dati relativi all'orientamento della periferica basati su absolute.

Per ottenere in modo affidabile l'attuale direzione della bussola attraverso sia Android e iOS browser oggi è necessario gestire entrambi i absolute e non absolute implementazioni che forniscono l'ulteriore webkitCompassHeading proprietà e fare in modo di tenere conto di eventuali modifiche orientamento attuale dello schermo come parte di tale . AFAIK l'unica libreria che attualmente lo fa è Full Tilt JS (disclaimer: sono l'autore di questa libreria).

Il seguente codice vi darà la stessa corretta bussola di attraversare sia per iOS e browser Android, tenendo conto delle differenze in un dispositivo di implementazioni di orientamento e applica ogni orientamento dello schermo runtime necessari trasforma troppo:

<!-- Include the Full Tilt JS library from https://github.com/richtr/Full-Tilt-JS --> 
<script src="fulltilt-min.js"></script> 

<script> 

    // Obtain a new *world-oriented* Full Tilt JS DeviceOrientation Promise 
    var promise = FULLTILT.getDeviceOrientation({ 'type': 'world' }); 

    // Wait for Promise result 
    promise.then(function(deviceOrientation) { // Device Orientation Events are supported 

    // Register a callback to run every time a new 
    // deviceorientation event is fired by the browser. 
    deviceOrientation.listen(function() { 

     // Get the current *screen-adjusted* device orientation angles 
     var currentOrientation = deviceOrientation.getScreenAdjustedEuler(); 

     // Calculate the current compass heading that the user is 'looking at' (in degrees) 
     var compassHeading = 360 - currentOrientation.alpha; 

     // Do something with `compassHeading` here... 

    }); 

    }).catch(function(errorMessage) { // Device Orientation Events are not supported 

    console.log(errorMessage); 

    // Implement some fallback controls here... 

    }); 

</script> 

Ecco a demo che dimostra questa tecnica per ottenere la direzione della bussola che l'utente sta affrontando. Dovrebbe funzionare bene su entrambi i browser iOS e Android.

L'implementazione del codice in quella demo è come mostrato sopra e può essere visualizzata su Github allo ./scripts/compass.js:L268-L272.

+1

ciao Richt, ho testato la tua libreria, funziona perfettamente, ma penso che non mi dia il vero Nord giusto? – Miguel

+3

nessuno di questi esempi dà il nord su Android. questo è uno scherzo totale. –

+0

@richt dopo aver ottenuto l'orientamento del dispositivo, come utilizzarlo per ottenere la direzione della bussola (direzione verso il punto B geografico)? Posso calcolare con successo il rilevamento (gradi) da 2 punti geografici (punto A e punto B). – jasan

0

Su Chrome per Android, è possibile utilizzare 'deviceorientationabsolute' listener di eventi:

if ('ondeviceorientationabsolute' in window) { 
    // Chrome 50+ specific 
    window.addEventListener('deviceorientationabsolute', handleOrientation); 
} else if ('ondeviceorientation' in window) { 
    window.addEventListener('deviceorientation', handleOrientation); 
} 

function handleOrientation(event) { 
    var alpha; 
    if (event.absolute) { 
    alpha = event.alpha; 
    } else if (event.hasOwnProperty('webkitCompassHeading')) { 
    // get absolute orientation for Safari/iOS 
    alpha = 360 - event.webkitCompassHeading; // conversion taken from a comment on Google Documentation, not tested 
    } else { 
    console.log('Could not retrieve absolute orientation'); 
    } 

    console.log('Absolute orientation: ' + alpha); 
} 

Vedi this article a Google Web Developer Documentation.

Testato su Chrome 63 per Android.

Problemi correlati