โดย Sensors API จะช่วยให้คุณอ่านข้อมูลเซ็นเซอร์ดิบในแอปได้แบบเรียลไทม์ โปรดใช้ API นี้เพื่อทําสิ่งต่อไปนี้
- ทํารายการแหล่งข้อมูลที่มีให้ใช้งานในอุปกรณ์และอุปกรณ์ที่ใช้ร่วมกัน
- ลงทะเบียนผู้ฟังเพื่อรับข้อมูลเซ็นเซอร์ดิบ
- ยกเลิกการลงทะเบียน Listener เพื่อไม่ได้รับข้อมูลเซ็นเซอร์ดิบอีกต่อไป
แสดงรายการแหล่งข้อมูลที่มีอยู่
หากต้องการดูรายการแหล่งข้อมูลที่มีอยู่ทั้งหมดในอุปกรณ์และในอุปกรณ์ที่ใช้ร่วมกัน ให้ใช้เมธอด SensorsClient.findDataSources
ดังนี้
Kotlin
private val fitnessOptions = FitnessOptions.builder().addDataType(DataType.TYPE_STEP_COUNT_DELTA).build() // Note: Fitness.SensorsApi.findDataSources() requires the // ACCESS_FINE_LOCATION permission. Fitness.getSensorsClient(requireContext(), GoogleSignIn.getAccountForExtension(requireContext(), fitnessOptions)) .findDataSources( DataSourcesRequest.Builder() .setDataTypes(DataType.TYPE_STEP_COUNT_DELTA) .setDataSourceTypes(DataSource.TYPE_RAW) .build()) .addOnSuccessListener { dataSources -> dataSources.forEach { Log.i(TAG, "Data source found: ${it.streamIdentifier}") Log.i(TAG, "Data Source type: ${it.dataType.name}") if (it.dataType == DataType.TYPE_STEP_COUNT_DELTA) { Log.i(TAG, "Data source for STEP_COUNT_DELTA found!") ... } } } .addOnFailureListener { e -> Log.e(TAG, "Find data sources request failed", e) }
Java
FitnessOptions fitnessOptions = FitnessOptions.builder().addDataType(DataType.TYPE_STEP_COUNT_DELTA).build(); // Note: Fitness.SensorsApi.findDataSources() requires the // ACCESS_FINE_LOCATION permission. Fitness.getSensorsClient(getApplicationContext(), GoogleSignIn.getAccountForExtension(getApplicationContext(), fitnessOptions)) .findDataSources( new DataSourcesRequest.Builder() .setDataTypes(DataType.TYPE_STEP_COUNT_DELTA) .setDataSourceTypes(DataSource.TYPE_RAW) .build()) .addOnSuccessListener(dataSources -> { dataSources.forEach(dataSource -> { Log.i(TAG, "Data source found: ${it.streamIdentifier}"); Log.i(TAG, "Data Source type: ${it.dataType.name}"); if (dataSource.getDataType() == DataType.TYPE_STEP_COUNT_DELTA) { Log.i(TAG, "Data source for STEP_COUNT_DELTA found!"); ... } })}) .addOnFailureListener(e -> Log.e(TAG, "Find data sources request failed", e));
หากต้องการข้อมูลเกี่ยวกับอุปกรณ์สําหรับแหล่งข้อมูล ให้ใช้เมธอด DataSource.getDevice
ข้อมูลอุปกรณ์มีประโยชน์เพื่อแยกข้อมูลออกจากเซ็นเซอร์ที่คล้ายกันในอุปกรณ์ที่แตกต่างกัน แสดงข้อมูลอุปกรณ์จากเซ็นเซอร์ต่อผู้ใช้ หรือประมวลผลข้อมูลแตกต่างกันไปตามอุปกรณ์ เช่น คุณอาจสนใจอ่านข้อมูลจากเซ็นเซอร์ในอุปกรณ์ที่สวมใส่ได้โดยเฉพาะ แต่อาจไม่ได้อ่านข้อมูลจากเซ็นเซอร์ประเภทเดียวกันในโทรศัพท์
หากต้องการรับอินสแตนซ์ของ Device
สําหรับอุปกรณ์ที่ดําเนินกิจกรรมอยู่ ให้ใช้เมธอด Device.getLocalDevice
วิธีนี้มีประโยชน์เมื่อต้องการตรวจสอบว่าแหล่งข้อมูลอยู่ในอุปกรณ์เดียวกับที่แอปทํางานอยู่หรือไม่
เพิ่ม Listener
หากต้องการเพิ่ม Listener เพื่อรับข้อมูลดิบของประเภทข้อมูลการออกกําลังกายบางประเภทหรือจากแหล่งข้อมูลเฉพาะ ให้ใช้เมธอด SensorsClient.add
ดังนี้
Kotlin
val listener = OnDataPointListener { dataPoint -> for (field in dataPoint.dataType.fields) { val value = dataPoint.getValue(field) Log.i(TAG, "Detected DataPoint field: ${field.name}") Log.i(TAG, "Detected DataPoint value: $value") } } Fitness.getSensorsClient(this, GoogleSignIn.getAccountForExtension(this, fitnessOptions)) .add( SensorRequest.Builder() .setDataSource(dataSource) // Optional but recommended for custom // data sets. .setDataType(dataType) // Can't be omitted. .setSamplingRate(10, TimeUnit.SECONDS) .build(), listener ) .addOnSuccessListener { Log.i(TAG, "Listener registered!") } .addOnFailureListener { Log.e(TAG, "Listener not registered.", task.exception) }
Java
OnDataPointListener listener = dataPoint -> { for (Field field : dataPoint.getDataType().getFields()) { Value value = dataPoint.getValue(field); Log.i(TAG, "Detected DataPoint field: ${field.getName()}"); Log.i(TAG, "Detected DataPoint value: $value"); } }; Fitness.getSensorsClient(this, GoogleSignIn.getAccountForExtension(this, fitnessOptions)) .add( new SensorRequest.Builder() .setDataSource(dataSource) // Optional but recommended // for custom data sets. .setDataType(dataType) // Can't be omitted. .setSamplingRate(10, TimeUnit.SECONDS) .build(), listener ) .addOnSuccessListener(unused -> Log.i(TAG, "Listener registered!")) .addOnFailureListener(task -> Log.e(TAG, "Listener not registered.", task.getCause())); }
นํา Listener ออก
หากต้องการนํา Listener ออกจากการอัปเดตข้อมูลดิบ ให้ใช้เมธอด SensorsClient.remove
ดังนี้
Kotlin
Fitness.getSensorsClient(this, GoogleSignIn.getAccountForExtension(this, fitnessOptions)) .remove(listener) .addOnSuccessListener { Log.i(TAG, "Listener was removed!") } .addOnFailureListener { Log.i(TAG, "Listener was not removed.") }
Java
Fitness.getSensorsClient(this, GoogleSignIn.getAccountForExtension(this, fitnessOptions)) .remove(listener) .addOnSuccessListener(unused -> Log.i(TAG, "Listener was removed!")) .addOnFailureListener(e -> Log.i(TAG, "Listener was not removed."));