2013-04-16 14 views
8

Kann ich Javascript plattformübergreifend verwenden, um den Kompass in iOS und Android (mit Chrome) zu finden, ohne etwas wie PhoneGap zu verwenden? Ich weiß, iOS hat DeviceOrientationEvent, aber ich kann keine Entsprechung für Chrome für Android finden.Kann ich Javascript verwenden, um den Kompass für iOS und Android zu erhalten?

+1

Es gibt eine [Web Compass API] (http://dev.w3.org/2009/dap/system-info/compass.html). Ich kenne die Browser-Unterstützung nicht, aber Sie können versuchen, auf 'getCurrentOrientation' im globalen Bereich zuzugreifen und zu sehen, ob es da ist. Sie können es auch mit dem Präfix "webkit" versuchen. Viel Glück! – Mohsen

Antwort

7

Ja können Sie! Leider funktioniert die alpha nicht auf iPhones/iPads. Bei Mobile Safari basiert alpha auf der Richtung, in die das Gerät bei der ersten Geräteausrichtung zeigte. Das mitgelieferte Webkit bietet Ihnen die Kompassrichtung. Um es für alle anderen Browsern (die alle Träger alpha als compassheading) können Sie den folgenden JavaScript-Code verwenden können:

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 auch Webkit unterstützt, so wäre auch verwenden event.webkitCompassHeading, aber das ist OK.

BTW: "oncompassneedscalibration" wird auch nicht für iPhones und iPads unterstützt.

+0

'' event.alpha'' ist nicht genug, um eine Kompassrichtung zu bekommen, '' alpha'' ist nur die z-Rotation eines Gerätes um seine eigene Achse (siehe http://w3c.github.io/deviceorientation/spec-our-orientation.html#rotations). Es ist jedoch möglich, Alpha, Beta und Gamma in eine Kompassrichtung zu übersetzen; Siehe die Antwort von @richt unten. – davidjb

+2

@davidjb: Ihre Antwort könnte Leser ohne gegebene Erklärungen verwirren und bezieht sich zB auch auf den Alphakanal. Hier ist ein visuelles Beispiel, das zeigt, dass der Alphakanal mit der horizontalen Ausrichtung aus der Halteransicht in Beziehung steht: https://dev.opera.com/articles/w3c-device-orientation-api/ Was Sie wahrscheinlich sagen wollten: Im Fall von Wenn Sie nur den Alphakanal für die Kompassrichtung verwenden, müssen Sie das Telefon horizontal und im Hochformat für eine ordnungsgemäße Verwendung halten. Sonst könnte das Telefon seine Ausrichtung verlieren und keine richtige Richtung anzeigen. – Jonny

11

Als Primer Sie this previous related StackOverflow answer und vertraut sein mit der allgemeinen practical considerations for using DeviceOrientation Events in Webanwendungen überprüfen soll.

Die einfache Lösung, die ich in my previous related StackOverflow answer gelten nur für Browser, die absolute deviceOrientation Ereignisse (d-Browser, wo die deviceOrientation alpha Eigenschaft ist Kompass -orientierten) implementieren. Das bedeutet, dass die dort angebotene Lösung derzeit nur in Android-Browsern und nicht in iOS-basierten Browsern oder anderen Browsern funktioniert, die keine absolute -basierten Geräteorientierungs-Ereignisdaten bereitstellen.

Um zuverlässig den aktuellen Kompasskurs über Android und iOS-Browser Sie müssen heute erhalten beide absolute und nicht absolute Implementierungen behandeln, die die zusätzliche webkitCompassHeading Eigenschaft bieten und stellen Sie sicher, dass für alle aktuelle Bildschirmausrichtung Änderungen Rechnung zu tragen als Teil . AFAIK die einzige Bibliothek, die dies derzeit tut, ist Full Tilt JS (Disclaimer: Ich bin der Autor dieser Bibliothek).

Der folgende Code wird Ihnen die gleiche richtige Kompass gibt in allen Browsern sowohl iOS und Android Überschrift, unter Berücksichtigung der Unterschiede in Geräteausrichtung Implementierungen zu nehmen und all notwendige Runtime-Bildschirmausrichtung Anwendung transformiert zu:

<!-- 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> 

Hier a demo, die diese Technik zeigt, um die Kompassrichtung zu erhalten, auf die der Benutzer blickt. Es sollte sowohl auf iOS- als auch auf Android-Browsern funktionieren.

Die Implementierung des Codes in dieser Demo ist wie oben gezeigt und kann auf Github unter ./scripts/compass.js:L268-L272 angesehen werden.

+1

Hallo Richt, ich habe deine Bibliothek getestet, funktioniert einwandfrei, aber ich denke es gibt mir nicht den richtigen Norden oder? – Miguel

+3

keines dieser Beispiele geben den Norden auf Android. Das ist ein totaler Witz. –

+0

@richt nach dem Erhalten der Geräteausrichtung, wie würde ich es verwenden, um den Kompass-Kurs (Richtung Geo Punkt B) zu bekommen? Ich kann Peilung (Grad) von 2 Geo-Punkten (Punkt A und Punkt B) erfolgreich berechnen. – jasan

0

On Chrome für Android können Sie 'deviceorientationabsolute' Ereignis-Listener verwenden:

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); 
} 

Siehe this article an Dokumentation für Entwickler Google Web.

Getestet auf Chrome 63 für Android.

Verwandte Themen