2013-12-19 3 views
0

Так что я работаю над андроидным приложением для Android, и я использую плагин компаса. Я следовал инструкциям с сайта phonegap, и все работает отлично, кроме одного.Прочитайте заголовок компаса только один раз

Первый пример (http://docs.phonegap.com/en/2.0.0/cordova_compass_compass.md.html#Compass) должен указывать заголовок (степень) в предупреждении один раз, но значение всегда равно 0! Но почему?

Итак, я работал над кодом, поэтому он будет похож на второй пример (без кнопок). Этот код проверяет, отображает ли степень каждую секунду. Теперь значение не равно 0, но от 1 до 360. это значение, которое я хочу, но я не хочу его каждую секунду, я хочу его только один раз. Есть ли способ проверить это только один раз?

document.addEventListener("deviceready", onDeviceReady, false); 

// Cordova is ready 
function onDeviceReady() { 
    navigator.compass.getCurrentHeading(onSuccess, onError); 
} 

// onSuccess: Get the current heading 
function onSuccess(heading) { 
    alert('Heading: ' + heading.magneticHeading); 
} 

// onError: Failed to get the heading 
function onError(compassError) { 
    alert('Compass Error: ' + compassError.code); 
} 

Так это стандартный JavaScript, и этот код должен дать заголовок Juist один раз, но он всегда дает 0.

$(document).ready(function() { 
// The watch id references the current `watchHeading` 
var watchID = null; 

// Wait for Cordova to load 
document.addEventListener("deviceready", onDeviceReady, false); 

// Cordova is ready 
function onDeviceReady() { 
    startWatch(); 
} 

// Start watching the compass 
function startWatch() { 
    var options = { frequency: 100 }; 
    watchID = navigator.compass.watchHeading(onSuccess, onError, options); 
} 

// Stop watching the compass 
function stopWatch() { 
    if (watchID) { 
     navigator.compass.clearWatch(watchID); 
     watchID = null; 
    } 
} 

// onSuccess: Get the current heading 
function onSuccess(heading) { 
    var element = document.getElementById('heading'); 
    element.innerHTML = heading.magneticHeading; 

    if (heading.magneticHeading > 180) { 
     document.getElementById('background').style.backgroundColor = 'green'; 
    } else { 
     document.getElementById('background').style.backgroundColor = 'blue'; 
    } 
} 

// onError: Failed to get the heading 
function onError(compassError) { 
    alert('Compass error: ' + compassError.code); 
} 
}); 

Этот код работает, но он проверяет, не один раз, но multple раз в секунду.

ответ

0

Не видя полного кода, который вы используете, я бы сказал, что первый пример может давать ноль, потому что устройство не готово (вы заметите, что во втором примере вызов watchHeading не выполняется до тех пор, пока после пожара девицериды).

Что касается второй проблемы, это связано с тем, что watchHeading постоянно запрашивает обратную связь (контролируется частотной опцией). После того, как вы получите идентификатор для часов, вам нужно вызвать clearWatch и передать ему этот идентификатор для остановки.

Если вы просто пытаетесь получить один заголовок, просто позвоните getHeading, а не watchHeading. Но сделайте это только после того, как устройство будет готово.

--- Edit ---

Это прослушивают меня достаточно, чтобы построить свой проект и проверить его на моем Droid 4 (работает 4.1.2). Возвращение 0-нормального поведения; это просто прогрев компаса (аналогично GPS, где вы хотите выбросить первое количество координат, которое вы получаете, поскольку они обычно устаревают). Обычно достаточно одного вызова, чтобы разогреть его, и после этого вы получите хорошие данные.

Поскольку вы не хотите постоянной обратной связи, я бы разогревал компас при запуске приложения (просто вызовите getCurrentHeading один раз), а затем снова вызовите getCurrentHeading, когда вам нужно.

В качестве альтернативы, продолжайте получать и получать обратную связь каждые несколько секунд, так как нет никакого вреда только для хранения последнего заголовка компаса, и он удерживает компас. Затем, когда вы хотите, чтобы ваше приложение использовало данные, вы можете либо просто вызвать getCurrentHeading, либо использовать сохраненные данные компаса.

+0

Я отредактировал мое сообщение. Я скопировал код из телефонного разговора. Как вы можете видеть, он уже использует getCurrentHeading, и он использует его только тогда, когда устройство готово. – bbvanee

+0

Какая версия устройства и ОС вы тестируете? – Geekswordsman

+0

HTC желание и Android, и да, у телефона есть компас – bbvanee

0

Вы должны вызвать stopWatch() изнутри onSuccess(), так как youv'e сказал watchHeading() повторять каждые 100 мс.

Смежные вопросы