เข้าถึงข้อมูลเซ็นเซอร์ดิบ

โดย 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."));