
目录
13.传感器与定位服务(二)
2.磁场传感器
3.加速度传感器
磁场传感器简称为M-sensor,主要用于读取Android设备外部的磁场强度。随着Android设备位置一段和摆放的状态,周围的磁场在设备X、Y、Z三个方向上的影响也会发生改变。
磁场传感器会返回3个数据,这3个数据分别代表X、Y、Z三个方向上的磁场数据。该数值的单位是微特斯拉(μT)。
通过使用磁场传感器,应用程序就可以检测到设备周围的磁场强度,因此,借助于磁场传感器可以开发出指南针等应用。
例:
PointerView.java
package com.example.compass;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.util.AttributeSet;
import android.view.View;
import androidx.annotation.Nullable;
public class PointerView extends View implements SensorEventListener {
private SensorManager sensorManager;//传感器管理器
private Bitmap pointer=null;//定义指针的位图对象
private float[] allValues;//磁场传感器的值
public PointerView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
//获取传感器管理器
sensorManager= (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
//为磁场传感器注册监听器
sensorManager.registerListener(this,sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD),
SensorManager.SENSOR_DELAY_GAME);
//指定要绘制的指针位图
pointer= BitmapFactory.decodeResource(super.getResources(),R.drawable.pointer);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//根据X轴、Y轴的磁场强度绘制指针
if(allValues!=null){
float x=allValues[0];//X轴的磁场强度
float y =allValues[1];//Y轴的磁场强度
canvas.save();//保存Canvas的状态
canvas.restore();//重置绘图对象
//设置旋转的中心点为屏幕的中心点
canvas.translate(super.getWidth()/2,super.getHeight()/2);
if(y==0 && x>0){//正东方
canvas.rotate(90);//旋转90度
}else if(y==0 && x<0){//正西方
canvas.rotate(270);//旋转270度
}else{
if(y>=0){
canvas.rotate((float) (Math.tanh(x/y)*90));
}else {
canvas.rotate(180+(float) (Math.tanh(x/y)*90));
}
}
canvas.drawBitmap(this.pointer,-this.pointer.getWidth()/2,-this.pointer.getHeight()/2,
new Paint());//绘制指针
}
}
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
if(sensorEvent.sensor.getType()==Sensor.TYPE_MAGNETIC_FIELD){
float[] values=sensorEvent.values;//获取磁场传感器的值
allValues=values;
super.postInvalidate();//刷新界面
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int i) {
}
}
加速度传感器是用于检测设备加速度的传感器。对于加速度传感器来说,SensorEvent对象的values属性将返回3个值,分别代表Android设备在X、Y、Z三个方向上的加速度,单位为m/s²。当Android设备横向左右移动时,可能产生X轴上的加速度;当Android设备前后移动时,可能产生Y轴上的加速度;当Android设备垂直上下移动时可能产生Z轴上的加速度。
通过使用加速度传感器,可以开发出类似微信摇一摇,以及运动App的计步功能。
例:
MainActivity.java
package com.example.shakeredpacket;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import android.annotation.SuppressLint;
import android.app.AlertDialog;
import android.app.Service;
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.Toast;
import java.security.Provider;
public class MainActivity extends AppCompatActivity implements SensorEventListener {
private SensorManager sensorManager;//定义传感器管理器对象
private Vibrator vibrator;//定义振动器
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ActionBar actionBar=getSupportActionBar();
actionBar.hide();
//获取传感器管理器
sensorManager= (SensorManager) getSystemService(Context.SENSOR_SERVICE);
//获取振动器
vibrator= (Vibrator) getSystemService(Service.VIBRATOR_SERVICE);
}
@Override
protected void onResume() {
super.onResume();
//为加速度传感器注册监听器
sensorManager.registerListener(this,sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_GAME);
}
@SuppressLint("MissingPermission")
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
int sensorType=sensorEvent.sensor.getType();//获取传感器类型
if(sensorType==Sensor.TYPE_ACCELEROMETER){
float[] values=sensorEvent.values;//获取传感器的值
if(values[0]>15 || values[1]>15 || values[2]>20){
Toast.makeText(MainActivity.this, "摇一摇", Toast.LENGTH_SHORT).show();
//创建一个对话框构建器
AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);
alertDialog.setView(R.layout.packet);//设置布局文件
alertDialog.show();//显示对话框
vibrator.vibrate(500);//设置振动器的频率
sensorManager.unregisterListener(this);//取消注册的监听器
}
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int i) {
}
}
Manifest.xml