Android 指南针校正

news/2024/10/22 17:31:09/

指南针

关于指南针的实现,网上已经有很多的文章了,简单搜一下都能看懂,原理都一样,要使用Android系统的传感器实现,我们先简单看一下指南针的实现过程。

指南针的实现

1.传感器

实现指南针需要的传感器可以分为两种,一种是屏幕方向传感器,但是已经被Google 标记为了 @Deprecated

@Deprecated
public static final int TYPE_ORIENTATION = 3;`

另一种比较新的方式,需要两个传感器配合,分别为加速度传感器和磁场传感器,我们主要说一下这种方式的实现。

public static final int TYPE_ACCELEROMETER = 1;
public static final int TYPE_MAGNETIC_FIELD = 2;
2.获取传感器

首先我们需要获取到这两个传感器,记得做判空操作。

sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
3.订阅监听

接下来订阅对这两个传感器的监听:

sensorManager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_NORMAL);
sensorManager.registerListener(this, magneticField, SensorManager.SENSOR_DELAY_NORMAL);

自定义监听实现接口:SensorEventListener ,这个接口有两个方法,分别是:

public void onSensorChanged(SensorEvent event);
public void onAccuracyChanged(Sensor sensor, int accuracy);

关于他们的作用,看一下接口里的注释,写的非常详细,顺便提一嘴,他们写的注释真是长,但是这真的是一个好习惯,对自己也是一个很好的提升的过程。

4.数据处理

最后就是对数据的处理了,通过用SDK中给出API对传感器返回数据的处理,就能获得当前的方向,这段代码我就直接贴出来吧,

 float[] R = new float[9];if (SensorManager.getRotationMatrix(R, null, accelerValues, magneticFieldValues)) {float[] orientation = new float[3];SensorManager.getOrientation(R, orientation);float direction = (float) Math.toDegrees(orientation[0]) * -1.0f;} else {Log.d("Compass", "Error: SensorManager.getRotationMatrix");}

到此为止,你就得到了指南针所需要的全部数据了,然后用这个数据去驱动一个Imageview + 动画,指南针就实现了。

指南针的校准

初步实现完了指南针,但是,转着转着,发现不准了角度,一看监听返回的数据也不准了,这时就需要来校准指南针了,具体的做法是什么呢,那就是拿手机画8,
图片来自网络
那什么时候需要校准呢,怎么判断呢?这就用到上面监听返回的参数了accuracy

 @Overridepublic void onAccuracyChanged(Sensor sensor, int accuracy) {Log.d("TAG", "onAccuracyChanged: :" +accuracy);}

那么什么时候校验呢,看一下注释,分了5个级别,分别是:

public static final int SENSOR_STATUS_NO_CONTACT = -1;
public static final int SENSOR_STATUS_UNRELIABLE = 0;
public static final int SENSOR_STATUS_ACCURACY_LOW = 1;
/*** This sensor is reporting data with an average level of accuracy,* calibration with the environment may improve the readings*/
public static final int SENSOR_STATUS_ACCURACY_MEDIUM = 2;
/** This sensor is reporting data with maximum accuracy */
public static final int SENSOR_STATUS_ACCURACY_HIGH = 3;

那么我们就可以知道,精度小于3个都不可信

 if (accuracy >= SensorManager.SENSOR_STATUS_ACCURACY_HIGH ) {Log.e("Compass", " 不需要校验");} else {Log.e("Compass", " 需要校准 "); }

至此,指南针的基本实现,校准的标准判断,就都有了,赶紧实现以下吧。


http://www.ppmy.cn/news/707132.html

相关文章

手机上测试东南西北方向软件,指南针怎么看东南西北(手机指南针怎么看图解)...

指南针怎么看东南西北(手机指南针怎么看图解) :我应该怎么走? :向南走,走到路口向西拐进去就到了。 :什么东南西北?我只知道左右前后8230; 这是我们生活中经常遇到的场景,或者说,是大多数人的日常状态。 每个人都知道上北下南左西右东,但在实际生活中,永远也分不清东…

android仿小米指南针

看图心动没&#xff1f;&#xff1f; 下面我们来看看代码吧&#xff0c;干货时间到&#xff1b; 1.项目结构 2.第一步新建一个calss&#xff0c;就起名叫Mi吧。一会用来绘制自定义View。 第二部在xml文件中放置插件 <?xml version"1.0" encoding"utf-8&qu…

Android指南针应用

目的&#xff1a;通过指南针应用来学习SensorManager、LocationManger的使用以及对android 6.0动态权限的适配 一、通过android的方向传感器获取手机方位 通过对比前一刻方位和现在手机方位算出手机旋转的角度&#xff0c;然后根据手机实际旋转的角度去旋转指南针的图片。 …

指南针的设置和使用

指南针小demo (1)设置背景图片,设置指南针背景图. //背景图片UIImageView* backgroundImage [[UIImageView alloc] initWithImage:[UIImage imageNamed:"BackGroundPad.png"]];[self.view addSubview:backgroundImage];//创建指南针图片self.compassImageView [[U…

Android指南针应用编写

目录 概述 一、运行环境&#xff1a; 二、编码 三、结果 四、总结 概述 由于最近有个地磁项目的需要&#xff0c;重温多年Android知识&#xff0c;通过手机地磁传感器数据&#xff0c;编写了一个指南针App&#xff0c;同时支持&#xff0c;获取手机端各个传感器数据&#…

制作简单的指南针

/**** 指南针简单制作**/ public class CompassActivity extends BaseActivity {private SensorManager sensorManager;Bind(R.id.compass_img)ImageView compassImg;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setCont…

指南针的实现

1、在/res/drawable/目录下放入指南针的图片 2、main.xml <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:l…

指南针和陀螺仪

http://www.code4app.com/thread-9058-1-1.html