1. 程式人生 > >Sensor系列五 App實現獲取gsensor資料

Sensor系列五 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 電話服務

作者:frank_zyp
您的支援是對博主最大的鼓勵,感謝您的認真閱讀。
本文無所謂版權,歡迎轉載。