Как сделать точный компас на Android

Мое приложение Android показывает направление определенного места в мире и поэтому нуждается в получении степени компаса.
Это код, который я использовал для вычисления степеней:

public void getDirection() { mySensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE); List<Sensor> mySensors = mySensorManager.getSensorList(Sensor.TYPE_ORIENTATION); if(mySensors.size() > 0){ mySensorManager.registerListener(mySensorEventListener, mySensors.get(0), SensorManager.SENSOR_DELAY_UI); } else{ TextView alert = (TextView)findViewById(R.id.instruct); alert.setText(getString(R.string.direction_not_found)); myCompassView.setVisibility(myCompassView.INVISIBLE); } } private SensorEventListener mySensorEventListener = new SensorEventListener(){ @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { // TODO Auto-generated method stub } @Override public void onSensorChanged(SensorEvent event) { // TODO Auto-generated method stub compassBearing = (float)event.values[0]; float bearing; bearing = compassBearing - templeBearing; if (bearing < 0) bearing = 360 + bearing; myCompassView.updateDirection(bearing); } }; 

Этот метод обычно работает, но иногда он просто набирает неправильный север, что мне нужно сделать, чтобы получить более точное местоположение?

Solutions Collecting From Web of "Как сделать точный компас на Android"

У меня есть несколько предложений для вас:

1) Ваше устройство не может быть откалибровано . Чтобы сделать это, переместите его в форме 8 ( см. Это ). Если вы этого не сделаете, если ваше устройство откалибровано или не проведет некоторые тесты, указав устройство в известном направлении кардинальной точки и сравните значения. Как правило, если устройство не откалибровано, вы увидите большие различия в величине азимута для небольших оборотов. Вот о чем я буду беспокоиться.

Теперь не забывайте, что датчик дает вам подшипник Магнитный Север, а не True North ! Это различие известно как склонение магнитного поля, и его значение изменяется от места к месту и время от времени из-за изменений магнитного поля Земли. Это приложение может вычислять некоторые из значений для вас с относительной точностью. Я бы не слишком беспокоился об этом, так как склонение обычно невелико, но вы можете искать хорошую точность (там, где я живу, склонение составляет 3º, в настоящее время).

2) Держитесь подальше от металлических предметов или предметов, создающих сильное магнитное поле . Например, не делайте тестов, если у вас есть телефон рядом с компьютером или любыми физическими клавиатурами! Это чистый яд для тестирования компаса-геолокации. Некоторые приложения могут измерять интенсивность магнитного поля (если устройство поддерживает его). Когда вы приблизитесь к металлу, вы испытаете более высокие значения и сильные изменения в направлениях. Для развлечения есть также некоторые « металлодетекторы »: это приложение распознает изменения магнитного поля и вибрирует, когда вы приближаетесь к «металлическому объекту» или тому, что магнитно мешает устройству.

3) Не забудьте обновить подшипник, когда вы наклоняете устройство в альбомный режим. ( Статья обязательна! ) Это связано с тем, что азимутальное значение основано на вращении перпендикулярной оси на плоскость телефона. Когда вы поворачиваете устройство на пейзаж, это значение изменяется на +/- 90º! Это не устраняется отключением ландшафтного режима приложения! Вам нужно будет определить его программно, анализируя вращения вокруг других двух осей (шаг и рулон). Это не тривиально, но есть примеры где-то в сети.

Edit: Если вас интересует какой-то код, ознакомьтесь с Mixare , это платформа с расширенным исходным кодом с открытым исходным кодом под GPL3 для Android. Взгляните на их код относительно ориентации, геолокации компаса и подшипника.

PS: У меня нет какой-либо связи с создателями упомянутых приложений.