1.只要android手机硬件提供了相关的传感器支持,就可以用来做个简单的指南针玩玩。

2.步骤简单如下:a.调用Context的getSystemService()方法获取sensorManager,它代表传感器的管理服务;b.指定所用传感器类型,sensor:可以创建一个特定的传感器实例,c.注册相应的监听事件sensorEvent事件对象,d.当传感器数据发生变化时回调

3.传感器的API不复杂,包含3个类和一个接口,分别是:SensorManager,Sensor,SensorEvent,SensorEventListener,共4个API。

4.基本使用方法:

实例化SensorManager

SensorManager mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);

当你不知道设备支持的Sensor时,可以先获取设备支持的传感器列表。

List<Sensor> deviceSensors = mSensorManager.getSensorList(Sensor.TYPE_ALL);

安卓平台提供了2个传感器用于让我们判断设备的位置,分别是地磁场传感器(the geomagnetic field sensor)和方向传感器(the orientation sensor),本文中用方向传感器,方向传感器是基于软件的,并且它的数据是通过加速度传感器和磁场传感器共同获得的

5.传感器坐标系统,z是指向地心的方位角,x轴是仰俯角(由静止状态开始前后反转),y轴是翻转角(由静止状态开始左右反转),如下图中所示,系统会给我们返回一个长度为三的float数组,包含三个方向值,按顺序分别是ZXY轴。

6.介绍差不多了,上源码。

package com.dragon.compass;import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.animation.Animation;
import android.view.animation.RotateAnimation;
import android.widget.ImageView;import java.util.List;public class Main extends AppCompatActivity implements SensorEventListener {ImageView znzImage;float currentDegree = 0f;SensorManager mSensorManager;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);znzImage = (ImageView)findViewById(R.id.znzImage);
//        获取传感器对象mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);List<Sensor> deviceSensors = mSensorManager.getSensorList(Sensor.TYPE_ALL);Log.e("dragon",deviceSensors+"");}@Overrideprotected void onResume(){super.onResume();mSensorManager.registerListener(this,mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION),SensorManager.SENSOR_DELAY_GAME);}@Overrideprotected void onPause(){mSensorManager.unregisterListener(this);super.onPause();}@Overrideprotected void onStop(){mSensorManager.unregisterListener(this);super.onStop();}@Overridepublic void onSensorChanged(SensorEvent event){int sensorType = event.sensor.getType();switch(sensorType){case Sensor.TYPE_ORIENTATION:float degree = event.values[0];RotateAnimation ra = new RotateAnimation(currentDegree,-degree, Animation.RELATIVE_TO_PARENT,0.5f,Animation.RELATIVE_TO_SELF,0.5f);ra.setDuration(200);znzImage.startAnimation(ra);currentDegree = -degree;break;}}@Overridepublic void onAccuracyChanged(Sensor sensor,int accuracy){}}

布局文件main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#fff"><ImageView
        android:id="@+id/znzImage"android:layout_width="match_parent"android:layout_height="match_parent"android:scaleType="fitCenter"android:src="@drawable/znz" />
</LinearLayout>

7.成功了但发现,方向传感器已经弃用了,Sensor.TYPE_ORIENTATION这上面会有一横线。为了后面学习者的连续性,将它进行改进,利用加速度传感器和地磁传感器来计算方向角。

新的替代方法,这里只用到了Z轴,用到了加速度传感器和地磁传感器

package com.dragon.compass;import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.animation.Animation;
import android.view.animation.RotateAnimation;
import android.widget.ImageView;public class Main extends AppCompatActivity implements SensorEventListener {ImageView znzImage;float currentDegree = 0f;SensorManager mSensorManager;private Sensor accelerometer;//加速度传感器private Sensor magnetic;//地磁传感器private float[] accelerometerValues = new float[3];private float[] magneticFieldValues = new float[3];@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);znzImage = (ImageView)findViewById(R.id.znzImage);
//        实例化管理者mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
//        List<Sensor> deviceSensors = mSensorManager.getSensorList(Sensor.TYPE_ALL);
//        Log.e("dragon",deviceSensors+"");
//        实例化加速度传感器accelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
//        实例化地磁传感器magnetic = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);calculateOrientation();}@Overrideprotected void onResume(){
//        注册监听事件mSensorManager.registerListener(this,accelerometer,SensorManager.SENSOR_DELAY_GAME);mSensorManager.registerListener(this,magnetic,SensorManager.SENSOR_DELAY_GAME);super.onResume();}@Overrideprotected void onPause(){mSensorManager.unregisterListener(this);super.onPause();}@Overrideprotected void onStop(){mSensorManager.unregisterListener(this);super.onStop();}private float calculateOrientation(){float[] values = new float[3];float[] R = new float[9];SensorManager.getRotationMatrix(R, null, accelerometerValues,magneticFieldValues);SensorManager.getOrientation(R, values);values[0] = (float) Math.toDegrees(values[0]);return values[0];
}@Overridepublic void onSensorChanged(SensorEvent event){if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {accelerometerValues = event.values;}if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {magneticFieldValues = event.values;}float degree = calculateOrientation();RotateAnimation ra = new RotateAnimation(currentDegree,-degree, Animation.RELATIVE_TO_PARENT,0.5f,Animation.RELATIVE_TO_SELF,0.5f);ra.setDuration(200);znzImage.startAnimation(ra);currentDegree=-degree;}@Overridepublic void onAccuracyChanged(Sensor sensor,int accuracy){}}

效果图



专注于AR的在移动端的实现,如果你还有问题没解决,你可以加入我们一起交流。或是关注我们的技术公众号,这是提供技术干货的地方,你有干货可以向我们推荐。

如果你觉得写的不错,对你有用,请在下面点个 支持一下嘛,有问题可以在下面留言评论。


github源码地址下载

android studio for android learning (二十三 )Android Orientation Sensor(方向传感器)与指南针实战(新方法替代orientation)相关推荐

  1. Android Studio开发蓝牙应用(二)

    Android Studio开发蓝牙应用(二) 实现的功能 与蓝牙模块HC-06交换信息 过程 新建Empty Activity 创建布局 activity_btread_and_write.xml ...

  2. 【Android Studio探索之路系列】之四:Android Studio快捷键

    作者:郭孝星 微博:郭孝星的新浪微博 邮箱:allenwells@163.com 博客:http://blog.csdn.net/allenwells github:https://github.co ...

  3. 用较新版本的Android Studio Chipmunk编译旧版本的Android 21的Sample

    技术发展这么快,经常遇到需要使用新版本的Android Studio来开发运行旧的Android工程,此时需要处理gradle兼容的问题 问题一.Could not install Gradle di ...

  4. android studio 远程调试,Unity3D学习笔记——Android远程真机调试(Unity Remote)

    前言:当使用Unity开发移动端的游戏,特别是使用到手机的传感器,如重力感应等,调试的时候,很麻烦, 因为每次都需要编译成APK后安装到手机中测试,而Unity Remote便能很好的解决这个问题,U ...

  5. access中的android sdk,Android Studio报错unable to access android sdk add-on list解决方案

    一.问题 初次安装Android Studio,启动后,报错如下: unable to access android sdk add-on lis 如图: 二.原因 AS启动后,会在默认路径下检测是否 ...

  6. Android Studio(3.6.2版本)安装 java2smali 插件,java2smali 插件的使用方法简述

    Android Studio(3.6.2版本)安装 java2smali 插件,java2smali 插件的使用方法简述 一.Android Studio(3.6.2版本)安装 java2smali ...

  7. android studio device功能,Android Studio 3.0找不到Android Device Monitor

    因为自Android Studio 3.0开始弃用Android Device Monitor,Android Developers官网上的原话是: Android Device Monitor is ...

  8. Android Studio同步失败设置代理,Android Studio如何设置代理?

    由于使用Android Studio期间,很多时候都要访问谷歌官方服务器,但是由于一些其他原因,会导致连接不上或者速度很慢,那就需要我们设置一下国内的镜像代理了.下面,让我们一起来看看Android ...

  9. android studio占内存大小,极大精简android studio在C盘的内存

    在C盘占很大的内存大约就2种原因: 1.SDK占内存太大 2.AVD模拟器占内存太大 第一种情况,移动SDK(用android studio不需要配置环境变量) 先移动C盘的Android目录,里面是 ...

  10. android studio真机调试失败,【Android】Android Studio真机调试的问题统整

    真机调试需要注意以下几个问题 [1]手机的USB调试需开启 [2]手机不能是仅充电模式,需要传输数据模式 [3]有些USB线会偷工减料,请拿一条没问题的线,例如买手机时原厂给的配线 [4]在PC端需要 ...

最新文章

  1. iOS 设置UILabel 的内边距
  2. 安装Kerberos服务端和客户端
  3. 巧克力情歌手---McKnight, Brian
  4. C++学习之路 | PTA乙级—— 1091 N-自守数 (15 分)(精简)
  5. git.exe 启动 慢_户外慢生活节来了!南京固城湖水慢城开启春日度假模式
  6. 在arm上运行x86动态库_苹果官宣:Arm取代英特尔
  7. IDEA 配置 SpringBoot 启动端口
  8. 2.1简单计算问题的求解
  9. 使用分层的方法设计 机器人软件
  10. micrium ucprobe使用笔记
  11. oracle多个参数查询,Oracle 多参数查询语句
  12. JPinyin繁体相互转换
  13. c++ 写一个复数计算器
  14. 洛谷 P3373 【模板】线段树 2 题解
  15. 服务器系统要用GUID还是MBR,win7mbr和guid应该选哪一个
  16. 第一场嵌入式笔试——CVTE嵌入式应用工程师
  17. 关于echarts省份地图不显示
  18. (转)反汇编算法介绍和应用——线性扫描算法分析
  19. matlab自带函数实现高斯滤波
  20. https+ip实现摄像头访问浏览器

热门文章

  1. OpenGL ES2 学习教程5——顶点属性
  2. 很不错的js幻灯片代码分享
  3. MVC项目开发中那些用到的知识点(Ajax.BeginForm)
  4. DOTFUN XML Silverlight中文留言簿Beta V1.0 即将上线!
  5. 1043 Is It a Binary Search Tree (25 分) BST反转?不反转 遍历+vector
  6. springboot @value 默认值_原创 | 搞定默认值
  7. spring cloud gateway 网关_33、Spring Cloud网关Gateway
  8. linux opencl安装方法,如何在Ubuntu上安装libOpenCL.so
  9. 多线程id为什么是负的?原因
  10. 直线/折线/圆/三角形划分平面直线切割球问题大总结(最多能划分多少区域)