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 = 磁场强度)

下面是我做的结果图

核心部分代码如下:

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(){@Overridepublic 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");}}}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);}@Overridepublic 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;}@Overridepublic 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 SimplifiableIfStatementif (id == R.id.action_settings) {return true;}return super.onOptionsItemSelected(item);}@Overridepublic 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;}}@Overridepublic 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() {@Overridepublic void onClick(View view) {snackbar.dismiss();}});snackbar.show();}@Overrideprotected void onPause() {super.onPause();sensorManager.unregisterListener(this);}@Overrideprotected 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获取重力加速度和磁场强度相关推荐

  1. android屏幕密度高度,Android获取常用辅助方法(获取屏幕高度、宽度、密度、通知栏高度、截图)...

    我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现.下面就分享一下Android中常用的一些辅助方法: 获取屏幕高度: /** * 获得屏幕高度 * @para ...

  2. Android获取当前时间

    2019独角兽企业重金招聘Python工程师标准>>> Android获取当前时间 2012-01-09 17:29:55|  分类: 私人日志 |字号 订阅 [转自stay] 取得 ...

  3. Android获取设备状态栏status bar高度的正确姿势

    Android获取设备状态栏高度的正确姿势 正确代码方式: int height = 0;int resourceId = getApplicationContext().getResources() ...

  4. 格式android id,android 获取APP的唯一标识applicationId的实例

    使用getIdentifier()方法可以方便的获各应用包下的指定资源ID. 方式一 int indentify = getResources().getIdentifier("com.te ...

  5. android 获取图片

    Android获取手机或者内存卡里面的图片有两种方式 1.这是通过一种action Intent intent=new Intent();intent.setAction(Intent.ACTION_ ...

  6. android 获取短信验证码倒计时

     android 获取短信验证码倒计时 public class MainActivity extends Activity { private Button submit;     privat ...

  7. [置顶] Android代码----android获取3G或wifi流量信息

    android获取3G或wifi流量信息: IBatteryStats battryStats = IBatteryStats.Stub.asInterface(ServiceManager.getS ...

  8. android 获取视频缩略图终极解决方案(ffmpeg)

    android 获取视频缩略图终极解决方案(ffmpeg) 参考文章: (1)android 获取视频缩略图终极解决方案(ffmpeg) (2)https://www.cnblogs.com/juka ...

  9. 【备忘】Android获取正在使用网络的IP4地址

    [备忘]Android获取正在使用网络的IP4地址 public String getLocalIpAddress() { String ipaddress="";try { fo ...

最新文章

  1. HDU2586(ST表+dfs)
  2. Python生物信息学⑤DNA转录RNA
  3. 使用Docker Compose部署基于Sentinel的高可用Redis集群
  4. git merge --squash改写提交
  5. 零基础学Python-爬虫-5、下载音频
  6. 关于Adapter的The content of the adapter has changed but ListView did not receive a notification.问题分析
  7. 通过SAP customizing修改显示message 的type
  8. 学习使用的编程及调试技巧
  9. javascript遍历对象属性和方法
  10. 全球搜索引擎集合(主要有移动搜索APP的)
  11. windows系统自带cmd命令下载文件(类似linux的wget下载文件)
  12. 计算机右键管理 该文件夹,文件右键菜单管理方法介绍【图文详解】
  13. CSDN余额充值协议
  14. Scrapy报错之:Request object has no attribute dont_filter
  15. matlab自带的mri数据集,探查三维 MRI 数据集的切片
  16. Python基础篇(三)-- 列表、元组、字典、集合、字符串
  17. 解析SQL的表间血缘关系工具
  18. 中国省市区--地区SQL表
  19. 网络精英赛模拟练习(4)
  20. STM32之W5500:掉线重联????

热门文章

  1. flutter 实现切屏横竖屏切换
  2. 中科院计算所体系结构国家重点实验室招收实习生
  3. 月薪20KPython程序员2018年Python学习进阶书籍推荐
  4. ajax加载远程数据
  5. android 一天多少毫秒,Android中的日期和时间以毫秒为单位
  6. 论文读书笔记-ranking comments on the social web
  7. 常德职院美和易思校企共建专业第一届PPT制作与演讲大赛圆满落幕
  8. 无法删除文件或文件夹的原因和解决方法(转)
  9. Perl语言入门笔记 第六章 哈希(hash)
  10. 天气预报发展简史:从玄学到科学