Android手机传感器的使用

传感器的分类

动作传感器

加速度传感器
重力传感器
陀螺仪

位置传感器

方向传感器
磁力传感器

环境传感器

温度传感器
压力传感器
亮度传感器

传感器的使用

1.获取SensorManager对象
2.执行SensorManager对象的getdefaultSensor()方法获取Sensor对象
3.获取Sensor对象的各种属性

获取安卓手机中所有传感器

public class MainActivity extends AppCompatActivity {

    private Button sensorButton;
    //SensorManager用于管理手机中所有传感器
    private SensorManager sensorManager;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });
        //得到系统服务(传感器服务) 得到SensorManagner对象
        sensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
        //获取Button
        sensorButton = (Button)findViewById(R.id.SensorButton);
        //给Button绑定监听器
        sensorButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                //得到手机中所有传感器
                List<Sensor> sensors = sensorManager.getSensorList(Sensor.TYPE_ALL);
                for(Sensor sensor : sensors) {
                    System.out.println(sensor.getName());
                }
            }
        });
    }

输出结果
在这里插入图片描述

传感器事件概念

传感器在通电的情况下不断地接收数据,我们的应用程序首先会把传感器注册到应用程序上,即告诉安卓操作系统应用程序需要用到某一个或几个传感器。当传感器检测到变化时,就会产生一个传感器事件(是一个对象)。传感器将传感器事件交给应用程序,通过传感器时间对象获取在这一时刻的数据。

如何将传感器注册到应用程序上?

使用SensorManager的registerListener方法

public boolean registerListener(SensorEventListener listener,
    Sensor sensor,int rate)

注册监听器registerListener
监听器接口对象,要实现该接口 SensorEventListener listener
传感器对象(注册的是哪一个传感器)Sensor sensor
注册传感器传递数据的时间 int rate
该函数返回的是布尔值,若注册的传感器在当前设备上是可用的,则返回值为真,否则为假。

传感器的采样率

SENSIR_DELAY_NORMAL (200000us)
SENSOR_DELAY_UI (60000us)
SENSOR_DELAY_GAME (20000us)
SENSOE_DELAY_FASTEST (0us)
设置传感器的准则:
尽量使用比较低的传感器采样率,这样对系统的负荷比较小,可以省电

传感器的属性

1.传感器的名称
getName()
2.传感器的制造商
getVendor()
3.传感器功率
getPower()
4.传感器的分辨率
getResolution()

加速度传感器的使用

加速度传感器的作用
{ A d = − ∑ F s / m a s s A d = − g − ∑ F / m a s s \left\{ \begin{aligned} A_{d} =- \sum F_{s}/mass\\ A_{d} =-g- \sum F/mass\\ \end{aligned} \right. Ad=Fs/massAd=gF/mass
手机三维坐标系统

主要代码

//得到系统服务(传感器服务) 得到SensorManagner对象
        sensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
        //获取加速度传感器对象
        Sensor accelerometerSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        //注册传感器
        sensorManager.registerListener(new SensorEventListener() {
            @Override
            public void onSensorChanged(SensorEvent event) {
                //float acc = event.accuracy;
                //float lux = event.values[0];
                System.out.println("x---->" + event.values[0]);
                System.out.println("y---->" + event.values[1]);
                System.out.println("z---->" + event.values[2]);
            }

            @Override
            public void onAccuracyChanged(Sensor sensor, int accuracy) {

            }
        },accelerometerSensor,SensorManager.SENSOR_DELAY_NORMAL);

输出结果
在这里插入图片描述
滤波器过滤加速度

public class MainActivity extends AppCompatActivity {

    private Button sensorButton;
    private Button sensorButton1;
    //重力加速度
    private float gravity[] = new float[3];
    //直线加速度
    private float lineaner_acceleration[] = new float[3];
    //SensorManager用于管理手机中所有传感器
    private SensorManager sensorManager;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //得到系统服务(传感器服务) 得到SensorManagner对象
        sensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
        //获取加速度传感器对象
        Sensor accelerometerSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        //注册传感器
        sensorManager.registerListener(new SensorEventListener() {
            @Override
            public void onSensorChanged(SensorEvent event) {
               final  float alpha = 0.8f;

               gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0];
               gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1];
               gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2];

               lineaner_acceleration[0] = event.values[0] - gravity[0];
               lineaner_acceleration[1] = event.values[1] - gravity[1];
               lineaner_acceleration[2] = event.values[2] - gravity[2];

               System.out.println(lineaner_acceleration[0]);
               System.out.println(lineaner_acceleration[1]);
               System.out.println(lineaner_acceleration[2]);
            }

            @Override
            public void onAccuracyChanged(Sensor sensor, int accuracy) {

            }
        },accelerometerSensor,SensorManager.SENSOR_DELAY_NORMAL);

运行结果
在这里插入图片描述

光线传感器的使用

主要代码

//得到系统服务(传感器服务) 得到SensorManagner对象
        sensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
        //获取光线传感器对象
        Sensor lightSensor = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
        //注册传感器
        sensorManager.registerListener(new SensorEventListener() {
            @Override
            public void onSensorChanged(SensorEvent event) {
            //获取传感器精度和亮度
                float acc = event.accuracy;
                float lux = event.values[0];
                System.out.println("acc---->" + acc);
                System.out.println("lux---->" + lux);
            }

            @Override
            public void onAccuracyChanged(Sensor sensor, int accuracy) {

            }
        },lightSensor,SensorManager.SENSOR_DELAY_NORMAL);

结果
在这里插入图片描述

方向传感器的使用

通过方向传感器可以获取设备与地球磁场北极之间的夹角
在这里插入图片描述
获取的值

1.Azimutg:设备围绕z轴旋转的角度,y轴与地磁北极之间的夹角,取值范围在0至360度之间

2.Pitch:设备围绕x轴旋转的角度,当z轴向y轴的正方向旋转时,该值为正数,反之则为负数,取值范围在-180度到180度之间

3.Roll:设备围绕y轴旋转的角度,当z轴向x轴正方向旋转时,该值为正数,反之则为负数,取值范围在-90度到90度之间
主要代码

public class MainActivity extends Activity implements SensorEventListener{

    private SensorManager msensorManager;
    private Sensor mOrientation;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        msensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
        mOrientation = msensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
        
    }

    @Override
    public void onAccuracyChanged(Sensor sensor,int accuracy){

    }

    @Override
    protected void onResume(){
        super.onResume();
        msensorManager.registerListener(this,mOrientation,SensorManager.SENSOR_DELAY_NORMAL);
    }

    @Override
    protected void onPause(){
        super.onPause();
        msensorManager.unregisterListener(this);
    }

    @Override
    public void onSensorChanged(SensorEvent event){
        float azimuth_angle = event.values[0];
        float pitch_angle = event.values[1];
        float roll_angle = event.values[2];

        System.out.println("azimuth_angle--->" + azimuth_angle);
        System.out.println("pitch_angle--->" + pitch_angle);
        System.out.println("roll_angle--->" + roll_angle);
    }
}

结果演示
在这里插入图片描述

距离传感器的使用

距离传感器的作用
判断设备与其它物体之间的距离
主要代码

public class MainActivity extends Activity implements SensorEventListener{

   
    private SensorManager msensorManager;
    private Sensor mProximity;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        msensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
        mProximity = msensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
    }

    @Override
    public void onAccuracyChanged(Sensor sensor,int accuracy){

    }

    @Override
    protected void onResume(){
        super.onResume();
        msensorManager.registerListener(this,mProximity,SensorManager.SENSOR_DELAY_NORMAL);
    }

    @Override
    protected void onPause(){
        super.onPause();
        msensorManager.unregisterListener(this);
    }

    @Override
    public void onSensorChanged(SensorEvent event){
        float distance = event.values[0];
        System.out.println("distance--->" + distance);
        System.out.println(mProximity.getMaximumRange());
    }
}

结果演示
在这里插入图片描述
PS:本文由看过Mars老师教程后总结

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值