Android Sensor序列5(MTK )---App实现获取gsensor数据
一、简介
前几篇sensor相关的文章介绍了sensor的hal及framework的知识,这一节以gsensor实时显示xyz轴坐标来分析,app层数据获取的过程,其实实现数据监控非常简单,主要分为下面三个步骤:
(1)获取Sensor服务:getSystemService;
(2)获取具体sensor对象:getDefaultSensor;
(3)注册数据监听器:registerListener;
二、详细过程分析
下面看实现数据显示的源码:
package com.example.yinpengzhang.myapplication_test2;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity implements SensorEventListener{
private TextView mTextView_x = null;
private TextView mTextView_y = null;
private TextView mTextView_z = null;
private SensorManager mSensorManager;
private Sensor gsensor;
private float mLastX,mLastY,mLastZ;
private String sX,sY,sZ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//定义xyz内容显示框TextView
mTextView_x = (TextView) findViewById(R.id.textView6);
mTextView_y = (TextView) findViewById(R.id.textView7);
mTextView_z = (TextView) findViewById(R.id.textView8);
//获取Sensor服务
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
//获取gsensor的对象
gsensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
//注册数据监听器,当有数据时会回调onSensorChanged方法
mSensorManager.registerListener((SensorEventListener) this, gsensor, SensorManager.SENSOR_DELAY_NORMAL);
}
//重写数据监控的onSensorChanged方法
@Override
public void onSensorChanged(SensorEvent event) {
if(event.sensor == null)
return ;
//判断获取的数据类型是不是gsensor
if(event.sensor.getType() == Sensor.TYPE_ACCELEROMETER){
//获得数据为float类型的数据
mLastX = event.values[0];
mLastY = event.values[1];
mLastZ = event.values[2];
//将float类型的数据转为字符型供textView显示
sX = String.valueOf(mLastX);
sY = String.valueOf(mLastY);
sZ = String.valueOf(mLastZ);
mTextView_x.setText(sX);
mTextView_y.setText(sY);
mTextView_z.setText(sZ);
}
}
protected void onStop(){ //同样在退出activity时要注销监听
super.onStop();
if(mSensorManager != null){
mSensorManager.unregisterListener(this);
mSensorManager = null;
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
}
上面代码中getSystemService是一个很重要的API, 根据传入的NAME来取得对应的Object,然后转换成相应的服务对象,例如:电源、震动、电话等服务,如下表所示。
传入的Name | 返回的对象 | 说明 |
WINDOW_SERVICE | WindowManager | 管理打开的窗口程序 |
LAYOUT_INFLATER_SERVICE | LayoutInflater | 取得xml里定义的view |
ACTIVITY_SERVICE | ActivityManager | 管理应用程序的系统状态 |
POWER_SERVICE | PowerManger | 电源的服务 |
ALARM_SERVICE | AlarmManager | 闹钟的服务 |
NOTIFICATION_SERVICE | NotificationManager | 状态栏的服务 |
KEYGUARD_SERVICE | KeyguardManager | 键盘锁的服务 |
LOCATION_SERVICE | LocationManager | 位置的服务,如GPS |
SEARCH_SERVICE | SearchManager | 搜索的服务 |
VEBRATOR_SERVICE | Vebrator | 手机震动的服务 |
CONNECTIVITY_SERVICE | Connectivity | 网络连接的服务 |
WIFI_SERVICE | WifiManager | Wi-Fi服务 |
TELEPHONY_SERVICE | TeleponyManager | 电话服务 |