Android获取设备传感器的方法
作者:破z晓
这篇文章主要为大家详细介绍了Android获取设备传感器的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
本文实例为大家分享了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) { } } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。