栏目分类:
子分类:
返回
终身学习网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
终身学习网 > IT > 软件开发 > 后端开发 > Java

13.Android学习之传感器与定位服务(二)

Java 更新时间:发布时间: 百科书网 趣学号

目录

13.传感器与定位服务(二)

2.磁场传感器

3.加速度传感器


13.传感器与定位服务(二)

2.磁场传感器

磁场传感器简称为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) {
​
    }
}
​

3.加速度传感器

加速度传感器是用于检测设备加速度的传感器。对于加速度传感器来说,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

转载请注明:文章转载自 www.051e.com
本文地址:http://www.051e.com/it/1032888.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 ©2023-2025 051e.com

ICP备案号:京ICP备12030808号