欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

android手机传感器总结

程序员文章站 2022-04-19 10:22:10
...

 

传感器的分类


动作传感器


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

位置传感器


方向传感器
磁力传感器

环境传感器


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

传感器的使用


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());
                }
            }
        });
    }

输出结果

android手机传感器总结
传感器事件概念


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

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


使用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()

加速度传感器的使用


加速度传感器的作用( 注:看原文)

​    

手机三维坐标系统

android手机传感器总结

主要代码

 

//得到系统服务(传感器服务) 得到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);

输出结果

android手机传感器总结

滤波器过滤加速度

 

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);

运行结果

android手机传感器总结
光线传感器的使用


主要代码

 

//得到系统服务(传感器服务) 得到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);

结果

android手机传感器总结
方向传感器的使用


通过方向传感器可以获取设备与地球磁场北极之间的夹角

android手机传感器总结

获取的值

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);
    }
}

结果演示

android手机传感器总结
距离传感器的使用


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

 

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());
    }
}

结果演示

 android手机传感器总结

转载自:https://blog.csdn.net/weixin_43896750/article/details/95942772?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.compare&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.compare

 

相关标签: 传感器 android