Android 传感器

说到传感器,相信大家都不会陌生吧,比如微信的摇一摇就用到了加速度传感器

传感器

一种物理设备或者生物器官,能够探测、感受外界的信号,物理条件(如光,热,适度)或化学组成 (如烟雾),并将探知的信息传递给其它的设备或者部件

传感器的种类

可以从不同的角度对传感器进行划分,转换原理(传感器工作的基本物理或化学效应) 、用途输出信号以及制作材料和工艺

一般是按工作原来来分 物理传感器化学传感器两类

手机上搭载的基本都是物理传感器

  • 方向传感器 (Orientation sensor)
  • 加速感应器(Accelerometer sensor)
  • 陀螺仪传感器 (Gyroscope sensor)
  • 磁场传感器 (Magnetic field sensor)
  • 距离传感器 (Proximity sensor)
  • 光线传感器 (Light sensor)
  • 气压传感器 (Pressure sensor)
  • 温度传感器 (Temperature sensor)
  • 重力感应器 (Gravity sensor)
  • 线性加速感应器 (Linear acceleration sensor)
  • 旋转矢量传感器 (Rotation vector sensor)
  • 相对湿度传感器 (Relative humidity sensor)
  • 近场通信 (NFC) 传感,NFC 和其它不一样,具有读写功能

除了上面罗列出的这些,还有其它的传感器,比如心率传感器,记步传感器,指纹传感器等

如果想查看 Android 支持多少传感器,可以访问 Android Sensor

查看当前设备支持的传感器

Android Sensor 可以知道 Android 支持数量庞大的传感器,但并不是每种传感器手机上都有

每台手机上搭载的传感器类型以及数目都可能是不一样的,比如 Nexus 5 支持的传感器类型有

重力,光线,距离,气压和陀螺仪

而 moto x 二代则有

重力,光线,距离和红外传感器

我们现在写一个 demo 来列出自己设备支持的传感器

下面的手机是我们 锤子 红色版,可以看到传感器真多,40+ 个


  1. 创建一个 空的 Android 项目 cn.twle.android.ListSensor

  2. 修改 activity_main.xml 添加一个文本框用于显示所有的传感器

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <ScrollView
            android:padding="16dp" 
            android:layout_width="match_parent"
            android:layout_height="match_parent">
            <TextView
                android:id="@+id/ms_sensor"
                android:layout_width="match_parent"
                android:layout_height="match_parent" />
        </ScrollView>
    </RelativeLayout>
    
  3. 修改 MainActivity.java

    package cn.twle.android.listsensor;
    
    import android.content.Context;
    import android.hardware.Sensor;
    import android.hardware.SensorManager;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.widget.TextView;
    
    import java.util.List;
    
    public class MainActivity extends AppCompatActivity {
    
        private TextView ms_sensor;
        private SensorManager sm;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
            ms_sensor = (TextView) findViewById(R.id.ms_sensor);
    
            List<Sensor> allSensors = sm.getSensorList(Sensor.TYPE_ALL);
            StringBuilder sb = new StringBuilder();
    
            sb.append("你手机上有以下 " + allSensors.size() + " 个传感器有:\n\n");
            for(Sensor s:allSensors){
                switch (s.getType()){
                    case Sensor.TYPE_ACCELEROMETER:
                        sb.append(s.getType() + " 加速度传感器(Accelerometer sensor)" + "\n");
                        break;
                    case Sensor.TYPE_GYROSCOPE:
                        sb.append(s.getType() + " 陀螺仪传感器(Gyroscope sensor)" + "\n");
                        break;
                    case Sensor.TYPE_LIGHT:
                        sb.append(s.getType() + " 光线传感器(Light sensor)" + "\n");
                        break;
                    case Sensor.TYPE_MAGNETIC_FIELD:
                        sb.append(s.getType() + " 磁场传感器(Magnetic field sensor)" + "\n");
                        break;
                    case Sensor.TYPE_ORIENTATION:
                        sb.append(s.getType() + " 方向传感器(Orientation sensor)" + "\n");
                        break;
                    case Sensor.TYPE_PRESSURE:
                        sb.append(s.getType() + " 气压传感器(Pressure sensor)" + "\n");
                        break;
                    case Sensor.TYPE_PROXIMITY:
                        sb.append(s.getType() + " 距离传感器(Proximity sensor)" + "\n");
                        break;
                    case Sensor.TYPE_TEMPERATURE:
                        sb.append(s.getType() + " 温度传感器(Temperature sensor)" + "\n");
                        break;
                    default:
                        sb.append(s.getType() + " 其他传感器" + "\n");
                        break;
                }
                sb.append("设备名称:" + s.getName() + "\n设备版本:" + s.getVersion() + "\n供应商:"
                        + s.getVendor() + "\n\n");
            }
            ms_sensor.setText(sb.toString());
        }
    }
    

传感器 (Sensor) 相关方法

从上面的 demo 中,我们可以总结出获取 Sensor 传感器以及获取传感器相关的一些信息流程如下

  1. 获得传感器管理器

    SensorManager sm = (SensorManager)getSystemService(SENSOR_SERVICE);
    
  2. 获得设备的传感器对象的列表

    List<Sensor> allSensors = sm.getSensorList(Sensor.TYPE_ALL);
    
  3. 迭代获取 Sensor 对象,然后调用对应方法获得传感器的相关信息

    for(Sensor s:allSensors){
        sensor.getName();           // 获得传感器名称
        sensor.getType();           // 获得传感器种类
        sensor.getVendor();         // 获得传感器供应商
        sensor.getVersion();        // 获得传感器版本
        sensor.getResolution();     // 获得精度值
        sensor.getMaximumRange();   // 获得最大范围
        sensor.getPower();          // 传感器使用时的耗电量 
    }
    

Android 基础教程

关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.