android 磁场传感器 罗盘,Android开发获取重力加速度和磁场强度的方法

本文实例讲述了Android开发获取重力加速度和磁场强度的方法。分享给大家供大家参考,具体如下:

Android获取重力加速度和磁场强度主要依靠:

Sensor.getRotationMatrix (float[] R, float[] I, float[] gravity, float[] geomagnetic)

输入数据:

gravity为重力传感器测得的重力加速度float[3];

geomagnetic为罗盘传感器测得的地磁数据float[3];

输出数据:

R为通过这个方法计算得到的从手机的设备到坐标系到真实世界坐标系的转换矩阵

I为从将地磁数据转换到重力数据所在坐标的旋转矩阵

[0 0 g] = R * gravity (g = 重力加速度)

[0 m 0] = I * R * geomagnetic (m = 磁场强度)

下面是我做的结果图

b53917b719e90efc922e4f131406ec65.png

核心部分代码如下:

public class MainActivity extends AppCompatActivity implements SensorEventListener {

private static final String TAG = "CompassActivity";

private SensorManager sensorManager;

//记录rotationMatrix矩阵值

private float[] r = new float[9];

private float[] gravity = null;

private float[] geomagnetic = null;

private float[] I=new float[9];

private Handler handler=new Handler(){

@Override

public void handleMessage(Message msg) {

if(gravity!=null&&geomagnetic!=null)

{

if(SensorManager.getRotationMatrix(r, I, gravity, geomagnetic)) {

float gri = gravity[0] * r[6] + gravity[1] * r[7] + gravity[2] * r[8];

float h= (I[3]*r[0]+I[4]*r[3]+I[5]*r[6])*geomagnetic[0]+

(I[3]*r[1]+I[4]*r[4]+I[5]*r[7])*geomagnetic[1]+

(I[3]*r[2]+I[4]*r[5]+I[5]*r[8])*geomagnetic[2];

TextView textView = (TextView) findViewById(R.id.textView);

textView.setText("重力加速度" + gri + "\n"+"磁场强度" + h + "\n");

}

}

}

};

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);

}

@Override

public boolean onCreateOptionsMenu(Menu menu) {

// Inflate the menu; this adds items to the action bar if it is present.

getMenuInflater().inflate(R.menu.menu_main, menu);

return true;

}

@Override

public boolean onOptionsItemSelected(MenuItem item) {

// Handle action bar item clicks here. The action bar will

// automatically handle clicks on the Home/Up button, so long

// as you specify a parent activity in AndroidManifest.xml.

int id = item.getItemId();

//noinspection SimplifiableIfStatement

if (id == R.id.action_settings) {

return true;

}

return super.onOptionsItemSelected(item);

}

@Override

public void onSensorChanged(SensorEvent sensorEvent) {

switch (sensorEvent.sensor.getType()){

case Sensor.TYPE_ACCELEROMETER:

gravity=sensorEvent.values;

handler.sendEmptyMessage(0);

break;

case Sensor.TYPE_MAGNETIC_FIELD:

geomagnetic=sensorEvent.values;

handler.sendEmptyMessage(0);

break;

default:break;

}

}

@Override

public void onAccuracyChanged(Sensor sensor, int i) {

}

private void showMessage(String message){

View view=findViewById(R.id.fab);

final Snackbar snackbar=Snackbar.make(view, message, Snackbar.LENGTH_INDEFINITE);

snackbar.setAction("关闭", new View.OnClickListener() {

@Override

public void onClick(View view) {

snackbar.dismiss();

}

});

snackbar.show();

}

@Override

protected void onPause() {

super.onPause();

sensorManager.unregisterListener(this);

}

@Override

protected void onResume() {

super.onResume();

Sensor sensor1=sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

sensorManager.registerListener(this,sensor1,SensorManager.SENSOR_DELAY_UI);

Sensor sensor2=sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);

sensorManager.registerListener(this,sensor2,SensorManager.SENSOR_DELAY_UI);

}

}

希望本文所述对大家Android程序设计有所帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/382934.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

html在线编辑器 asp.net,ASP.NET网站使用Kindeditor富文本编辑器配置步骤

1. 下载编辑器下载 KindEditor 最新版本,下载页面: http://www.kindsoft.net/down.php2. 部署编辑器解压 kindeditor-x.x.x.zip 文件,将editor文件夹复制到web目录下3、在网页中加入(ValidateRequest"false")4、引入脚本文件(XXX部分需要修改)…

html中通过定位 实现下拉,JS+CSS相对定位实现的下拉菜单

本文实例讲述了JSCSS相对定位实现的下拉菜单。分享给大家供大家参考。具体如下:这里使用的是相对定位,不过效果还可以,用时候再修整一下,这个只是实现了大概功能,还有许多细节没有修饰。运行效果截图如下:在…

html页面包含头文件,Web前端技术:HTML部分---Head标签中包含的头文件标签,body标签包含的内部标签...

1、Head标签中包含的 头文件标签的作用:(1)title标签:定义网页的标题。(2)meta标签:一般用于定义页面的特殊信息,例如页面的关键字、页面描述等(3)link标签:用于引入外部样式文件(CSS 文件)。(4)style标签:…

HTML如何做个播放器图表,Web绘图神器之ECharts-ts文件播放器

前言最近在做一个项目需要用到大量的图形报表来展示数据。就去对比了一些前端图形报表框架,有Highcharts、Echarts、Three.js。发现Three.js比较笨重,不太适合数据展示,做前端动画还是比较好。而highcharts、echarts比较轻量级拿来就用比较方…

计算机网络原码反码补码,计算机的原码和反码及补码到底是什么

数据在计算机里面都是以0和1存储和运算的,这是冯诺依曼体系的基础。比如一个数在计算机中若有正负之分,则用一个数的最高位(符号位)用来表示它的正负,其中0表示正数,1表示负数。原码就是整数绝对值的二进制形式,为了解…

关于计算机应用基础问题,《计算机应用基础》习题及问题详解

《计算机应用基础》习题及问题详解 (17页)本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦!19.90 积分实用文档第一章 计算机基础知识填空题:1. 信息技术在现代工业工程中的应用十分广泛&…

计算机网络安全本科大学排名,2021网络工程专业大学排名 最好大学排行榜

2021网络工程专业大学排名 最好大学排行榜2021-06-11 19:35:09文/丁雪竹网络工程专业在全国最好的大学是哪几所呢,最好的大学排名是什么样呢,小编整理网络工程专业大学最好大学排行榜,仅供参考!网络工程专业最好大学排行榜在网络工…

20线程测试cpu性能软件,评测平台介绍、CPU多线程性能测试

2、平台介绍及CPU性能测试AMD AM3平台CPUAMD FX-8150(4模块/8核)AMD FX-8350(4模块/8核)主板华硕 Crosshair V Formula(BIOS版本:1605)Intel LGA1155平台CPUIntel Core i5 3570K(4核/4线程)Intel Core i7 3770K(4核/8线程)主板华硕 P8Z77-V Deluxe共用配件硬盘主盘&…

大型网站服务器 pdf,大型网站服务器容量规划[PDF][145.25MB]

内容简介内 容 提 要本书讲解了用数学回归分析方法来做服务器容量规划的思路,让读者掌握服务器容量规划的量化方法;模型的选择是服务器容量规划的关键,不同的程序有不同的模型。本书使用nginxPHPMySQL为实例演示了具体的规划过程,…

穿越火线全部服务器都显示爆满,穿越火线大区全部爆满,频道挤不进去背后的故事!...

大家好我是小包子,穿越火线经历了十一周年,盛典游戏更新后,我们发现游戏基本上所有大区都呈现爆满的盛世。我们热爱的穿越火线又回来了吗?6月小包子曾爆料CF启动量超过吃鸡跃居第二,射击游戏第一,重回巅峰的…

服务器加根网线用不用修改路由器,安装设置无线路由器需要用几根网线?

“安装设置无线路由器需要用几根网线?看到网上安装设置路由器的教程,有的说需要两根网线,有的说需要一根网线,请问到底应该使用一根还是两根呢?”其实这个问题的答案并不是唯一的,使用一根还是两根&#xf…

大数运算#

大数,就是C/C中利用基本类型所不能存储的数字,少则数十位,大则几万位,如何存储和计算大数就是本文的内容。 在C和C中,没有存储大数的数据结构,就算 unsigned long long也只能表示19位的数字  如果我们用d…

linux之缓冲区

行缓冲。在这种情况下,当在输入和输出中遇到换行符时,标准I/O库执行I/O操作。这允许我们一次输出一个字符,但只有在写了一行之后才进行实际I/O操作。当流涉及一个终端时,通常使用行缓冲。 第一个例子:(he…

linux之地址空间

程序:一组指令的有效集合。它是静态的,不具有任何的运行意义。程序最终转换为二进制文件。 进程:程序的执行就是进程。可以把它看成独立的程序,在内存中有其对应的代码空间和数据空间。一个进程所拥有的数据和代码只属于自己。进…

C语言随机数生成超详解

1.首先来看一段简单的代码 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <time.h>int main(void) {int i;printf(" %6d\n", rand());system("pause"); }printf(" %6d\n", rand());sys…

模板

模板是泛型编程的基础&#xff0c;即与类型无关的逻辑代码。 利用模板机制可以显著减少冗余信息&#xff0c;能大幅度地节约程序代码&#xff0c;进一步提高面向对象程序的可重用性和可维护性。 模板是实现代码重用机制的一种工具&#xff0c;它可以实现类型参数化&#xff1b;…

linux-----强大的find

我又回来了。哈哈。今天我们来说一下linux中的另一个强大的find命令&#xff0c;灰常重要&#xff0c;灰常重要&#xff0c;灰常重要。显而易见&#xff0c;find就是对某一个文件或者目录的查找喽。但是它的一个显著的特点就是&#xff1a;一般放在后台执行&#xff0c;从整个文…

C语言模拟实现标准库函数之strcmp()

strcmp() C/C函数&#xff0c;比较两个字符串 设这两个字符串为str1&#xff0c;str2&#xff0c; 若str1str2&#xff0c;则返回零&#xff1b; 若str1<str2&#xff0c;则返回负数&#xff1b; 若str1>str2&#xff0c;则返回正数。 char * my_strcmp(char *key,…

linux之task_struct

每个进程中都有一个进程控制块--PCB。PCB--维护进程相关的信息。然而&#xff0c;linux内核的进程控制块就是task_struct结构体&#xff0c;它可以保存进程的信息。 所有运行在系统里的进程都以task_struct链表的形式存在内核里。 每个进程都将它的信息放在task_struct结构体…

C语言模拟实现标准库函数之memcpy()

memcpy&#xff08;&#xff09; 1.如果我们需要对一个数组初始化&#xff0c;把数组的内容全部置0&#xff0c;那么能不能用strcpy() int main() {char arr1[10] { 0 };char arr2[10] " abcdefg ";strcpy(arr2, arr1);system("pause");return 0; } 我…