iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 20
0
Mobile Development

Android Pie 底層開發學習心得系列 第 26

[Day-26] Android Pie Sensor (3) 應用

  • Guide:
    • 介紹 (Overview)
    • 架構 (Architecture)
    • 應用 (Application)
    • 服務 (Service)
    • 硬件抽象層 (HAL)

概述

Android Sensor Framework為應用程序提供了下面幾個類和接口:

  • SensorManager
    為你提供一個 sensor service 的實例,它能夠為了提供多種服務
    (查詢 sensor 數量,註冊/卸載sensor 事件監聽函數,獲取 sensor 精度、速率、校準等信息)
  • Sensor
    指向一個具體 sensor 的實例,調用方法獲取配置和數據.
  • SensorEvent
    指向一個 sensor 事件對象的信息,包含了傳感器的數值,設備類型,精度,事件的時間戳等.
  • SensorEventListener
    可以創建兩個接收通知函數,一個是當 sensor 數據變化時,
    一個是當sensor精度變化時被調用.

應用程序調用 sensor 相關的 API 主要用來完成兩件事:

  • 獲取 sensor 種類以及每種 sensor 的屬性
  • 獲取 sensor 上報應用層的各項數據

下面製作一個簡單的 apk,
列出手機上所有傳感器,
然後將所關心的那個傳感器數據顯示出來.

測試

獲取傳感器列表,讀取數據代碼:

//get sensor manager
mSensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);

//show sensor list
List<Sensor> sensors = mSensorManager.getSensorList(Sensor.TYPE_ALL);
System.out.println("get sensor list:");
for (Sensor s: sensors) {
    System.out.println("name:" + s.getName());
    System.out.println("string_type:" + s.getStringType());
    System.out.println("vendor:" + s.getVendor());
}

//gyro
Sensor mGyroSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);
if (mGyroSensor == null) {
    System.out.println("gyro sensor is null.");
    mViewGyro.setText("gyro sensor is null.");
}
mSensorManager.registerListener(new SensorEventListener() {
    long last_ts = 0;
    @Override
    public void onSensorChanged(SensorEvent sensorEvent) {
        String string = "sensor_gyro=(
						" + new DecimalFormat("0.00").format(sensorEvent.values[0]) + 
						"," + new DecimalFormat("0.00").format(sensorEvent.values[1]) + 
						"," + new DecimalFormat("0.00").format(sensorEvent.values[2]) + 
						")\nts=" + sensorEvent.timestamp  + "\ninterval=" + 
						(sensorEvent.timestamp - last_ts)/1000/1000 + "ms";
        last_ts = sensorEvent.timestamp;
        //System.out.println(string);
        mViewGyro.setText(string);
    }
    @Override
    public void onAccuracyChanged(Sensor sensor, int i) {
        System.out.println("onAccuracyChanged.");
    }
},mGyroSensor,sample_type);

只要把上述的程式碼編譯成 apk 放到手機上,
就可以看到旋轉手機的時候,讀取到的數值也跟著改變。
應用就先稍微貼一個範例囉!
下一篇我們再來好好深入探討 framework 層的服務程式碼。


Reference :

Sensors Overview | Android Developers

samples/ApiDemos/src/com/example/android/apis/os/RotationVectorDemo.java - platform/development - Git at Google


上一篇
[Day-25] Android Pie Sensor (2) 架構
下一篇
[Day-27] Android Pie Sensor (4) 服務 (1)
系列文
Android Pie 底層開發學習心得30

尚未有邦友留言

立即登入留言