Android获取设备传感器的方法

Iria ·
更新时间:2024-09-20
· 295 次阅读

本文实例为大家分享了Android获取设备传感器的具体代码,供大家参考,具体内容如下

结果示例:

xml代码:

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:tools="http://schemas.android.com/tools"     android:layout_width="match_parent"     android:layout_height="match_parent"     xmlns:app="http://schemas.android.com/apk/res-auto"     tools:context=".MainActivity">     <LinearLayout         android:id="@+id/liner"         android:orientation="vertical"         android:layout_width="match_parent"         android:layout_height="wrap_content">         <TextView             android:id="@+id/text"             android:layout_width="match_parent"             android:layout_height="wrap_content"             android:hint="text"/>         <TextView             android:id="@+id/accText"             android:layout_width="match_parent"             android:layout_height="wrap_content"             android:hint="accText"/>         <TextView             android:id="@+id/luxText"             android:layout_width="match_parent"             android:layout_height="wrap_content"             android:hint="luxText"/>     </LinearLayout>     <GridLayout         android:id="@+id/gl"         android:layout_width="match_parent"         android:layout_height="wrap_content"         android:columnCount="1"         android:padding="20dp"         android:rowCount="5"         android:layout_below="@+id/liner">         <Button             android:id="@+id/findAllSensorBut"             android:layout_width="match_parent"             android:layout_height="wrap_content"             android:text="获取所有传感器列表" />         <Button             android:id="@+id/lightBut"             android:layout_width="match_parent"             android:layout_height="wrap_content"             android:layout_marginTop="10dp"             android:text="光线传感器" />         <Button             android:id="@+id/accelerationBut"             android:layout_width="match_parent"             android:layout_height="wrap_content"             android:layout_marginTop="10dp"             android:text="加速度传感器" />         <Button             android:id="@+id/orientationBut"             android:layout_width="match_parent"             android:layout_height="wrap_content"             android:layout_marginTop="10dp"             android:text="方向传感器" />         <Button             android:id="@+id/proximityBut"             android:layout_width="match_parent"             android:layout_height="wrap_content"             android:layout_marginTop="10dp"             android:text="距离传感器" />     </GridLayout>    <LinearLayout        android:id="@+id/lsLiner"        android:orientation="vertical"        android:layout_below="@+id/gl"        android:layout_width="match_parent"        android:layout_height="match_parent">        <TextView            android:text="传感器列表:"            android:layout_width="match_parent"            android:layout_height="wrap_content"/>        <ListView            android:id="@+id/lv"            android:layout_width="match_parent"            android:layout_height="wrap_content"/>    </LinearLayout> </RelativeLayout>

java代码:

package com.chy.myActivity; import androidx.appcompat.app.AppCompatActivity; import android.Manifest; import android.content.Context; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity implements View.OnClickListener {     // 动态申请权限     private String[] permissions = {             Manifest.permission.INTERNET,// 网络权限             Manifest.permission.CAMERA,// 相机权限             Manifest.permission.RECORD_AUDIO,// 音频录制权限             Manifest.permission.ACCESS_FINE_LOCATION,// 定位权限             Manifest.permission.WRITE_EXTERNAL_STORAGE,// 写入数据权限             Manifest.permission.READ_EXTERNAL_STORAGE,// 读取数据权限             Manifest.permission.ACCESS_COARSE_LOCATION // 获取基站的服务信号权限,以便获取位置信息     };     private Button findAllSensorBut;// 所有传感器列表     private Button lightBut;// 光线传感器     private Button accelerationBut;// 加速度传感器     private Button orientationBut;// 方向传感器     private Button proximityBut;// 距离传感器     private SensorManager sensorManager;// 传感器管理器对象     private TextView text;     private TextView accText;     private TextView luxText;     private float gravity[] = new float[3];     private float linear_acceleration[] = new float[3];     private ListView listView;     @Override     protected void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.activity_main);         initView();         // 获得传感器管理器对象         sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);     }     private void initView(){         text = findViewById(R.id.text);         accText = findViewById(R.id.accText);         luxText = findViewById(R.id.luxText);         // 所有传感器列表         findAllSensorBut = findViewById(R.id.findAllSensorBut);         findAllSensorBut.setOnClickListener(this);         // 光线传感器         lightBut = findViewById(R.id.lightBut);         lightBut.setOnClickListener(this);         // 加速度传感器         accelerationBut = findViewById(R.id.accelerationBut);         accelerationBut.setOnClickListener(this);         // 方向传感器         orientationBut = findViewById(R.id.orientationBut);         orientationBut.setOnClickListener(this);         // 距离传感器         proximityBut = findViewById(R.id.proximityBut);         listView = findViewById(R.id.lv);     }     /**      * 按钮点击事件      * */     @Override     public void onClick(View v) {         switch (v.getId()){             case R.id.findAllSensorBut:// 传感器列表                 // 数据                 ArrayList<String> data = new ArrayList<>();                 // 获取设备中所有传感器                 List<Sensor> sensors = sensorManager.getSensorList(Sensor.TYPE_ALL);                 for (Sensor sensor : sensors) {                     System.out.println("传感器:"+sensor.getName());                     data.add(sensor.getName());                 }                 ArrayAdapter adapter = new ArrayAdapter(this,android.R.layout.simple_list_item_1,data);                 listView.setAdapter(adapter);                 break;             case R.id.lightBut:// 光线传感器                 //得到默认的光线传感器                 Sensor lightSensor=sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);                 //绑定监听器(上下文接口,要监听的传感器,传感器采样率<时间间隔>),返回结果                 Boolean light_res =sensorManager.registerListener(new LightSensorListener(),lightSensor,SensorManager.SENSOR_DELAY_NORMAL);                 Toast.makeText(this,"绑定光线传感器:"+light_res,Toast.LENGTH_LONG).show();                 break;             case R.id.accelerationBut:// 加速度传感器                 Sensor accelerometerSensor=sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);                 Boolean acceleration_res=sensorManager.registerListener(new AccerationSensorListener(),accelerometerSensor,SensorManager.SENSOR_DELAY_NORMAL);                 Toast.makeText(this,"绑定加速度传感器:"+acceleration_res,Toast.LENGTH_LONG).show();                 break;             case R.id.orientationBut:// 方向传感器                 Sensor orientationSensor=sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);                 Boolean orient_res=sensorManager.registerListener(new OrientaationListener(),orientationSensor,SensorManager.SENSOR_DELAY_NORMAL);                 Toast.makeText(this,"绑定方向传感器:"+orient_res,Toast.LENGTH_LONG).show();                 break;             case R.id.proximityBut:// 距离传感器                 Sensor proximitySensor=sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);                 Boolean proximity_res=sensorManager.registerListener(new ProximityListener(),proximitySensor,SensorManager.SENSOR_DELAY_NORMAL);                 Toast.makeText(this,"绑定距离传感器:"+proximity_res,Toast.LENGTH_LONG).show();                 break;         }     }     /**      * 光线传感器类      * */    public class LightSensorListener implements SensorEventListener{         @Override         //传感器的数据被打包成event,主要的检测数据放在enent.values[]数组中         public void onSensorChanged(SensorEvent event) {             System.out.println(event.timestamp);//时间戳             System.out.println(event.sensor.getResolution());//分辨率(能识别出最小数值)             System.out.println(event.accuracy);//精度(等级)             System.out.println(event.values[0]);//光线强度         }         @Override         //传感器精度变化时调用这个函数         public void onAccuracyChanged(Sensor sensor, int accuracy) {}     }     /**      * 加速度传感器类      * */    public class AccerationSensorListener implements SensorEventListener{         @Override         public void onSensorChanged(SensorEvent event) {             final float alpha=0.8f;             //event.values[0]X轴加速度,负方向为正             //event.values[1]Y轴加速度,负方向为正             //event.values[2]Z轴加速度,负方向为正             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];             linear_acceleration[0]=event.values[0]-gravity[0];             linear_acceleration[1]=event.values[1]-gravity[1];             linear_acceleration[2]=event.values[2]-gravity[2];             //通过以上公式可以抛去三个方向上的重力加速度,只剩下纯加速度             text.setText(linear_acceleration[0] + "");             accText.setText(linear_acceleration[1] + "");             luxText.setText(linear_acceleration[2] + "");         }         @Override         public void onAccuracyChanged(Sensor sensor, int accuracy) {}     }     /**      * 方向传感器类      * */     public class OrientaationListener implements SensorEventListener{         @Override         public void onSensorChanged(SensorEvent event) {             //(需要手机屏幕向上,向下的话南北会反掉)设备绕Z轴旋转,Y轴正方向与地磁北极方向的夹角,顺时针方向为正,范围【0,180】             float azimuth=event.values[0];             //设备绕X轴旋转的角度,当Z轴向Y轴正方向旋转时为正,反之为负,范围【-180,180】             float pitch=event.values[1];             //设备绕Y轴旋转的角度,当Z轴向X轴正方向旋转时为负,反之为正,范围【-90,90】             float roll=event.values[2];             text.setText(azimuth+"");             accText.setText(pitch +"");             luxText.setText(roll+"");         }         @Override         public void onAccuracyChanged(Sensor sensor, int accuracy) {}     }     /**      * 距离传感器类      * */   public class ProximityListener implements SensorEventListener{         @Override         public void onSensorChanged(SensorEvent event) {             //距离传感器测试手机屏幕距离别的物体的记录,只有两个值:0和5             //距离很近时为0,否则为5             System.out.println(event.values[0]+"");         }         @Override         public void onAccuracyChanged(Sensor sensor,int accuracy) {         }     } }



方法 传感器 Android

需要 登录 后方可回复, 如果你还没有账号请 注册新账号
相关文章