android 传感器的使用

安卓传感器使用
传感器的分类
动作传感器
位置传感器
环境传感器
传感器的使用
获取安卓手机中所有传感器
传感器事件概念
如何将传感器注册到应用程序上?
传感器的采样率
传感器的属性
加速度传感器的使用
光线传感器的使用
方向传感器的使用
距离传感器的使用
传感器的分类
动作传感器
加速度传感器
重力传感器
陀螺仪

位置传感器
方向传感器
磁力传感器

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

使用传感器的权限

 AndroidManifest.xml 按需添加如下权限。

<uses-permission android:name="android.hardware.sensor.proximity" />
<uses-permission android:name="android.hardware.sensor.light" />
<uses-permission android:name="android.hardware.sensor.gyroscope" />
<uses-permission android:name="android.hardware.sensor.accelerometer" />

传感器的使用
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()

加速度传感器的使用
加速度传感器的作用

手机三维坐标系统

主要代码

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

 结果演示

结束

  • 13
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的Android应用程序,使用加速度传感器来模拟摇动骰子的过程: 1. 创建一个新的Android项目,命名为“ShakeDice”。 2. 在MainActivity.java中添加以下代码: ```java public class MainActivity extends AppCompatActivity implements SensorEventListener { private SensorManager sensorManager; private Sensor accelerometer; private static final int SHAKE_THRESHOLD = 1500; private long lastShakeTime = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); } @Override protected void onResume() { super.onResume(); sensorManager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_UI); } @Override protected void onPause() { super.onPause(); sensorManager.unregisterListener(this); } @Override public void onSensorChanged(SensorEvent event) { if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { long currentTime = System.currentTimeMillis(); if ((currentTime - lastShakeTime) > 1000) { float x = event.values[0]; float y = event.values[1]; float z = event.values[2]; float acceleration = (float) Math.sqrt(x * x + y * y + z * z) - SensorManager.GRAVITY_EARTH; if (acceleration > SHAKE_THRESHOLD) { rollDice(); lastShakeTime = currentTime; } } } } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { } private void rollDice() { // 模拟骰子摇动的过程 Toast.makeText(this, "骰子摇动了!", Toast.LENGTH_SHORT).show(); } } ``` 3. 在layout文件夹中创建一个新的布局文件,命名为“activity_main.xml”,并添加一个TextView控件用于显示骰子的结果。 ```xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:orientation="vertical"> <TextView android:id="@+id/dice_result" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="24sp" /> </LinearLayout> ``` 4. 在MainActivity.java的rollDice()方法中生成随机数模拟骰子的结果,并将结果显示在TextView控件中。 ```java private void rollDice() { Random rand = new Random(); int result = rand.nextInt(6) + 1; Toast.makeText(this, "骰子摇动了:" + result, Toast.LENGTH_SHORT).show(); TextView diceResult = findViewById(R.id.dice_result); diceResult.setText("骰子结果:" + result); } ``` 5. 运行应用程序并摇动设备,可以看到骰子的结果在TextView中显示出来了。 注意:为了使加速度传感器正常工作,需要在AndroidManifest.xml文件中添加以下权限: ```xml <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-feature android:name="android.hardware.sensor.accelerometer" android:required="true" /> ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值