未加工のセンサーデータにアクセスする

Sensors API を使用すると、アプリ内の生のセンサーデータをリアルタイムで読み取ることができます。使用 次の処理を行います。

  • デバイスとコンパニオン デバイス上の利用可能なデータソースを一覧表示する。
  • 生のセンサーデータを受信するリスナーを登録します。
  • リスナーの登録を解除して、未加工のセンサーデータを受信できないようにします。

使用可能なデータソースを一覧表示する

デバイスおよびコンパニオンで使用可能なすべてのデータソースのリストを取得する 使用する場合は、 SensorsClient.findDataSources メソッド:

KotlinJava
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)
   
}
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 メソッドを呼び出します。これは、データソースがアプリが実行されているデバイスと同じデバイス上にあるかどうかを確認する場合に便利です。

リスナーを追加する

特定のフィットネス データタイプの元データを受信するリスナーや、 使用する場合は、 SensorsClient.add メソッド:

KotlinJava
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)
   
}
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()));
}

リスナーを削除する

元データの更新からリスナーを削除するには、SensorsClient.remove メソッドを使用します。

KotlinJava
Fitness.getSensorsClient(this, GoogleSignIn.getAccountForExtension(this, fitnessOptions))
   
.remove(listener)
   
.addOnSuccessListener {
       
Log.i(TAG, "Listener was removed!")
   
}
   
.addOnFailureListener {
       
Log.i(TAG, "Listener was not removed.")
   
}
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."));