需要源码请点赞关注收藏后评论区留言~~~
一、传感器的种类
传感器Sensor是一系列感应器的总称,是Android设备用来感知周围环境和运动信息的工具。 因为具体的感应信息依赖于相关硬件,所以虽然Android定义了众多感应器,但是并非每部手机都能支持这么多感应器。 传感器一般借助于硬件监听环境信息改变,有时会结合软件监听用户的运动信息。
传感器常见的种类如下
Sensor类的传感器类型 | 传感器名称 | 说明 |
TYPE_ACCELEROMETER | 加速度 | 常用于摇一摇功能 |
TYPE_MAGNETIC_FIELD | 磁场 | |
TYPE_ORIENTATION | 方向 | 已弃用,取而代之的是getOrientation方法 |
TYPE_GYROSCOPE | 陀螺仪 | 用来感应手机的旋转和倾斜 |
TYPE_LIGHT | 光线 | 用来感应手机正面的光线强弱 |
TYPE_PRESSURE | 压力 | 用来感应气压 |
TYPE_PROXIMITY | 距离 | |
TYPE_GRAVITY | 重力 | |
TYPE_STEP_DETECTOR | 步行检测 | 用户每走一步就触发一次事件 |
TYPE_STEP_COUNTER | 步行计数 | 记录激活后的步伐数 |
运行测试App如下 每台手机支持的传感器功能可能不太一样 读者可自行测试
代码如下
package com.example.iot;
import android.annotation.SuppressLint;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@SuppressLint("DefaultLocale")
public class SensorActivity extends AppCompatActivity {
private TextView tv_sensor; // 声明一个文本视图对象
private String[] mSensorType = {
"加速度", "磁场", "方向", "陀螺仪", "光线",
"压力", "温度", "距离", "重力", "线性加速度",
"旋转矢量", "湿度", "环境温度", "无标定磁场", "无标定旋转矢量",
"未校准陀螺仪", "特殊动作", "步行检测", "计步器", "地磁旋转矢量",
"心跳速率", "倾斜检测", "唤醒手势", "掠过手势", "拾起手势",
"手腕倾斜", "设备方向", "六自由度姿态", "静止检测", "运动检测",
"心跳检测", "动态元事件", "未知", "低延迟离体检测", "低延迟体外检测"};
private Map<Integer, String> mapSensor = new HashMap<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sensor);
tv_sensor = findViewById(R.id.tv_sensor);
showSensorInfo(); // 显示手机自带的传感器信息
}
// 显示手机自带的传感器信息
private void showSensorInfo() {
// 从系统服务中获取传感管理器对象
SensorManager mSensorMgr = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
// 获取当前设备支持的传感器列表
List<Sensor> sensorList = mSensorMgr.getSensorList(Sensor.TYPE_ALL);
String show_content = "当前支持的传感器包括:\n";
for (Sensor sensor : sensorList) {
if (sensor.getType() >= mSensorType.length) {
continue;
}
mapSensor.put(sensor.getType(), sensor.getName());
}
for (Map.Entry<Integer, String> map : mapSensor.entrySet()) {
int type = map.getKey();
String name = map.getValue();
String content = String.format("%d %s:%s\n", type, mSensorType[type - 1], name);
show_content += content;
}
tv_sensor.setText(show_content);
}
}
二、利用加速度传感器实现摇一摇功能
加速度传感器是最常见的感应器,大部分智能手机都内置了加速度传感器。 加速度传感器运用最广泛的功能是微信的摇一摇,用户通过摇晃手机寻找周围的人。
摇一摇功能实现步骤如下
(1)声明一个SensorManager对象。
(2)重写Activity的onResume方法,在该方法中注册传感器监听事件。
(3)重写Activity的onPause方法,在该方法中注销传感器事件。
(4)编写一个传感器事件监听器,该监听器继承自SensorEventListener,并实现onSensorChanged和onAccuracyChanged两个方法。
运行测试效果如下 摇一下手机 达到系统设定的阈值之后就会显示如下界面
代码如下
package com.example.iot;
import android.annotation.SuppressLint;
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.os.Vibrator;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import com.example.iot.util.DateUtil;
@SuppressLint("SetTextI18n")
public class AccelerationActivity extends AppCompatActivity implements SensorEventListener {
private TextView tv_shake; // 声明一个文本视图对象
private SensorManager mSensorMgr; // 声明一个传感管理器对象
private Vibrator mVibrator; // 声明一个震动器对象
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_acceleration);
tv_shake = findViewById(R.id.tv_shake);
// 从系统服务中获取传感管理器对象
mSensorMgr = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
// 从系统服务中获取震动器对象
mVibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
}
@Override
protected void onPause() {
super.onPause();
mSensorMgr.unregisterListener(this); // 注销当前活动的传感监听器
}
@Override
protected void onResume() {
super.onResume();
// 给加速度传感器注册传感监听器
mSensorMgr.registerListener(this,
mSensorMgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_NORMAL);
}
@Override
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { // 加速度变更事件
// values[0]:X轴,values[1]:Y轴,values[2]:Z轴
float[] values = event.values;
if ((Math.abs(values[0]) > 15 || Math.abs(values[1]) > 15
|| Math.abs(values[2]) > 15)) {
tv_shake.setText(DateUtil.getNowFullDateTime() + " 我看到你摇一摇啦");
mVibrator.vibrate(500); // 系统检测到摇一摇事件后,震动手机提示用户
}
}
}
// 当传感器精度改变时回调该方法,一般无需处理
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {}
}
创作不易 觉得有帮助请点赞关注收藏~~~