Совет профессионала: создайте свой собственный магнитный компас, используя внутренние датчики Android

Если вы хотите превратить ваше Android-устройство в компас, разработчик Уильям Дж. Фрэнсис покажет вам, как сделать это за пять простых шагов. Если вы хотите превратить ваше Android-устройство в компас, разработчик Уильям Дж

Изображение: iStock / koya79

Когда-нибудь задумывались, как работает компас? Я никогда не думал об этом до прошлой недели, когда мы с сыном шли в поход по национальному парку, и я не мог получить сигнал GPS.

Когда я наконец вернулся к цивилизации, я начал расчесывать Android форумы для примера кода цифрового компаса и обнаружили, что большинство свободно доступных примеров использовали устаревший Sensor.TYPE_ORIENTATION. Немного больше копания, и я обнаружил, что Sensor.TYPE_ORIENTATION на самом деле никогда не был настоящим аппаратным датчиком, а программным сервисом, который составлял значения акселерометра и датчика магнитного поля.

Таким образом, потянув из нескольких онлайн-источников, включая Статья в Википедии, в которой сравниваются радианы с градусами Мне удалось создать простой магнитный компас. Если вы заинтересованы в том, чтобы превратить ваше Android-устройство в компас, вы можете следовать инструкциям ниже или скачать и импортировать проект прямо в Eclipse ,

1. Создайте новый проект Android в Eclipse. Целевой SDK 14 (ICS) или лучше.

2. В файле AndroidManifest.xml запросите разрешения для точных и грубых местоположений. В этом случае я также блокирую ориентацию в портретном режиме.

AndroidManifest.xml <? Xml version = "1.0" encoding = "utf-8"?> <Manifest xmlns: android = "http://schemas.android.com/apk/res/android" package = "com.authorwjf. whichwayisup "android: versionCode =" 1 "android: versionName =" 1.0 "> <использовании-sdk android: minSdkVersion =" 14 "android: targetSdkVersion =" 19 "/> <использование-разрешения android: name =" android.permission. ACCESS_FINE_LOCATION "/> <разрешение использования android: name =" android.permission.ACCESS_COARSE_LOCATION "/> <приложение android: allowBackup =" true "android: icon =" @ drawable / ic_launcher "android: label =" @ string / app_name " android: theme = "@ style / AppTheme"> <активность android: screenOrientation = "портрет" android: name = ". MainActivity" android: label = "@ string / app_name"> <intent-filter> <действие android: name = "android.intent.action.MAIN" /> <категория android: name = "android.intent.category.LAUNCHER" /> </ intent-filter> </ activity> </ application> </ manifest>

3. Вам понадобится указатель для вашего компаса. Я выбрал изображение ниже и застрял в папке / res / drawable-xhdpi.

4. Измененный файл activity_main.xml в папке / res / layout - это просто изображение, центрированное в относительном макете.

activity_main.xml <RelativeLayout xmlns: android = "http://schemas.android.com/apk/res/android" xmlns: tools = "http://schemas.android.com/tools" android: layout_width = "match_parent" android: layout_height = "match_parent" android: paddingBottom = "@ Dimen / Activity_vertical_margin" android: paddingLeft = "@ Dimenter / Activity_horizont_margin" android: paddingRight = "@ Dimensions / Activity_horizont_margin" android: paddingTop = "@ dimension / Activity_vertical_margin" = "com.authorwjf.whichwayisup.MainActivity"> <ImageView android: id = "@ + id / pointer" android: layout_width = "wrap_content" android: layout_height = "wrap_content" android: layout_centerInParent = "true" android: src = " @ drawable / pointer "/> </ RelativeLayout>

5. Мы можем закодировать наш компас в файле /src/MainActivity.java. Я не буду пытаться объяснить математику в событии изменения датчика, потому что это выходит за рамки этой статьи, и потому что моя тригонометрия ржавая, и просто заставить ее работать, у меня болит голова. Однако я сравнил свой компас с Google Maps, и он, похоже, постоянно указывает на север, что я считаю победой. Одной из важных вещей, которые необходимо учитывать для сохранения заряда батареи устройства, является регистрация и отмена регистрации датчиков при включении и включении, соответственно.

Пакет MainActivity.java com.authorwjf.whichwayisup; импорт android.app.Activity; импорт android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; импорт android.hardware.SensorManager; импорт android.os.Bundle; импорт android.view.animation.Animation; import android.view.animation.RotateAnimation; import android.widget.ImageView; открытый класс MainActivity расширяет Activity реализует SensorEventListener {private ImageView mPointer; частный SensorManager mSensorManager; Частный датчик-акселерометр; Частный датчик mMagnetometer; private float [] mLastAccelerometer = новый поплавок [3]; private float [] mLastMagnetometer = новый float [3]; приватный логический mLastAccelerometerSet = false; частный логический mLastMagnetometerSet = false; private float [] mR = new float [9]; private float [] mOrientation = new float [3]; закрытое плавание mCurrentDegree = 0f; @Override protected void onCreate (Bundle saveInstanceState) {super.onCreate (сохраненныйInstanceState); setContentView (R.layout.activity_main); mSensorManager = (SensorManager) getSystemService (SENSOR_SERVICE); mAccelerometer = mSensorManager.getDefaultSensor (Sensor.TYPE_ACCELEROMETER); mMagnetometer = mSensorManager.getDefaultSensor (Sensor.TYPE_MAGNETIC_FIELD); mPointer = (ImageView) findViewById (R.id.pointer); } protected void onResume () {super.onResume (); mSensorManager.registerListener (this, mAccelerometer, SensorManager.SENSOR_DELAY_GAME); mSensorManager.registerListener (this, mMagnetometer, SensorManager.SENSOR_DELAY_GAME); } protected void onPause () {super.onPause (); mSensorManager.unregisterListener (this, mAccelerometer); mSensorManager.unregisterListener (this, mMagnetometer); } @Override public void onSensorChanged (событие SensorEvent) {if (event.sensor == mAccelerometer) {System.arraycopy (event.values, 0, mLastAccelerometer, 0, event.values.length); mLastAccelerometerSet = true; } else if (event.sensor == mMagnetometer) {System.arraycopy (event.values, 0, mLastMagnetometer, 0, event.values.length); mLastMagnetometerSet = true; } if (mLastAccelerometerSet && mLastMagnetometerSet) {SensorManager.getRotationMatrix (mR, ноль, mLastAccelerometer, mLastMagnetometer); SensorManager.getOrientation (mR, mOrientation); float azimuthInRadians = mOrientation [0]; float azimuthInDegress = (float) (Math.toDegrees (azimuthInRadians) +360)% 360; RotateAnimation ra = новая RotateAnimation (mCurrentDegree, -azimuthInDegress, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); ra.setDuration (250); ra.setFillAfter (истина); mPointer.startAnimation (ра); mCurrentDegree = -azimuthInDegress; }} @Override public void onAccuracyChanged (Датчик, внутренняя точность) {// TODO Автоматически сгенерированная заглушка метода}}

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

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

  • Компас указывает на магнитный север, а не на истинный север. Чтобы определить последнее, вам нужно указать свое местоположение через GPS или Wi-Fi, а затем рассчитать смещение.
  • Поскольку мы используем датчик магнитного поля, существует довольно много шума, который я не пытаюсь ослабить.
  • Вы найдете, что этот простой пример лучше всего работает на ровной поверхности, предпочтительно на открытом воздухе.

Если какие-либо разработчики разбираются в графике и графике, я бы с удовольствием прочитал ваши комментарии о том, как повысить точность.

Похожие

Мастер PHP | Maven и PHP
Apache Maven - это инструмент автоматизации сборки, предназначенный для создания, составления отчетов и создания документации по проектам. Он строит проекты с использованием объектной модели проекта (POM) и набора плагинов, общих для всех проектов, использующих Maven, тем самым обеспечивая единую систему сборки. Когда вы ознакомитесь с тем, как создается один проект Maven, вы автоматически узнаете, как создаются все проекты Maven. Это сэкономит вам огромное количество времени от попыток навигации
Я приглашаю вас прочитать гостевую запись Marcin Pachla, частного автора блог о музыке Kinta.com.pl...
Я приглашаю вас прочитать гостевую запись Marcin Pachla, частного автора блог о музыке Kinta.com.pl
Java для Android
... android_w_java.png"> Хотя для создания приложений для Android можно использовать несколько языков, Java - это язык, который Google рекомендует использовать разработчикам. Однако это не совсем то же самое, что Java, с которым вы, возможно, сталкивались на других
AR SDK: поддержка iOS 11 и Android 8
Никогда еще событие Apple не было таким ожидаемым, как событие этого года. Еще до выхода «Золотого мастера» iOS 11 уже изменила правила игры. Аркыт принес в массы дополненную реальность без маркеров и повысил ожидания в отношении новых версий iPhone (iPhone 8 и iPhone X). Среди фронтальных 3D-датчиков, обновлений камеры,
Как запускать приложения Firefox OS в вашем браузере Android
Реклама Теперь вы можете установить приложения Firefox OS на Android. Firefox для Android поддерживает Mozilla «Открытые веб-приложения», что позволяет устанавливать и запускать приложения Firefox OS непосредственно на устройстве Android. Firefox Marketplace теперь функционирует как альтернативный магазин приложений для Android, так же как Amazon App Store
Интерактивное картографирование
Интерактивное картографирование использует ГИС (Глобальная информационная система) для отображения точных данных на карте. Работая в системе слоев, различные уровни географической информации располагаются друг над другом. В отличие от статических карт, интерактивные карты имеют ряд преимуществ, предназначенных для улучшения отображения большого количества полных данных. Некоторые из этих функций включают в себя: Возможность создавать слои информации, которые могут
11 полезных инструментов для проверки, очистки и оптимизации вашего файла CSS
Реклама Многие считают, что минимизация размера файла таблицы стилей CSS - это хороший способ увеличить скорость загрузки вашего сайта. Действительно, уменьшив CSS-файл на несколько килобайт, серверу потребуется меньше времени для загрузки,
QuarkXPress теперь поддерживается в macOS Sierra
Хорошая новость: QuarkXPress 2015 и QuarkXPress 2016 теперь поддерживаются в macOS Sierra. QuarkXPress 8, 9 и 10 - бегите на свой страх и риск Более того, хотя QuarkXPress 10 официально
Скачать песни с YouTube проще, чем когда-либо
Хотите прослушать песню с YouTube в автономном режиме, но не знаете как? Чувствуете, что не можете загружать песни с YouTube без осложнений и хлопот? Ну, эта статья может помочь вам в том, как легко скачать песни с YouTube. От iMobie | Опубликовано: 30 октября 2018, Последнее обновление: 25 апреля 2019 YouTube, как один из самых популярных веб-сайтов в мире, является веб-сайтом для обмена видео, который позволяет нам исследовать разнообразный
Руководство пользователя беспроводных мониторов Dell
Вы можете использовать функцию Miracast для проецирования экрана ноутбука Windows, телефона Android или планшета Android через интерфейс Wi-Fi Direct на беспроводные мониторы Dell. После подключения ноутбука, смартфона или планшета к беспроводному монитору Dell вы можете получить доступ к мыши и клавиатуре, подключенным к монитору, для управления устройствами. Вы можете расширить или дублировать свой рабочий стол Windows на одном из этих мониторов, используя планшет или смартфон
Использование групповой политики для распространения JRE с отключенным автоматическим обновлением
... используя путь UNC, а не букву диска. Когда консоль GPO запросит у вас метод развертывания, выберите «Дополнительно» и нажмите «ОК»: Консоль GPO отобразит диалоговое окно свойств для пакета. Выберите вкладку «Модификации» и нажмите кнопку «Добавить», чтобы добавить
Xml <?
Encoding = "utf-8"?
Чувствуете, что не можете загружать песни с YouTube без осложнений и хлопот?