Atribuição de dados

Cada ponto de dados no Google Fit tem uma fonte de dados associada. As fontes de dados contêm informações que identificam o app ou o dispositivo que coleta ou transforma os dados. O nome do pacote do app está disponível para fontes de dados que não representam um sensor físico.

O Google Fit permite o seguinte:

  • Invocar uma intent para ver dados associados a um app específico.
  • Receber intents para mostrar dados usando o app.
  • Descubra qual app inseriu uma sessão. Para saber mais, consulte Trabalhar com sessões.

Determinar qual app inseriu um ponto de dados

Para saber o nome do pacote do aplicativo que inseriu um ponto de dados, primeiro chame DataPoint.getOriginalDataSource para acessar a fonte de dados e, em seguida, chame o método DataSource.getAppPackageName:

Kotlin

val dataPoint : DataPoint = ...
val dataSource = dataPoint.originalDataSource
val appPkgName = dataSource.appPackageName

Java

DataPoint dataPoint = ...
DataSource dataSource = dataPoint.getOriginalDataSource();
String appPkgName = dataSource.getAppPackageName();

Receber intents de outros apps

Para registrar o app e receber intents de outros apps de saúde e bem-estar, declare um filtro de intent no manifesto que seja semelhante ao seguinte:

<intent-filter>
    <action android:name="vnd.google.fitness.VIEW" />
    <data android:mimeType="vnd.google.fitness.data_type/com.google.step_count.cumulative" />
    <data android:mimeType="vnd.google.fitness.data_type/com.google.step_count.delta" />
</intent-filter>

Cada intent que o app recebe do Google Fit é de apenas um tipo, mas é possível filtrar por vários tipos MIME em um único filtro de intent. O filtro de intent do app precisa incluir todos os tipos de dados com suporte do app, incluindo tipos de dados personalizados.

As intents de condicionamento físico incluem os seguintes extras:

  • vnd.google.gms.fitness.start_time
  • vnd.google.gms.fitness.end_time
  • vnd.google.gms.fitness.data_source

É possível ver dados desses extras da seguinte maneira:

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    ...
    val supportedType = DataType.getMimeType(DataType.TYPE_STEP_COUNT_DELTA)

    if (Intent.ACTION_VIEW == intent.action && supportedType == intent.type) {
        // Get the intent extras
        val startTime = Fitness.getStartTime(intent, TimeUnit.MILLISECONDS);
        val endTime = Fitness.getEndTime(intent, TimeUnit.MILLISECONDS)
        val dataSource = DataSource.extract(intent)
    }
}

Java

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ...
    String supportedType = DataType.getMimeType(DataType.TYPE_STEP_COUNT_DELTA);

    if (Intent.ACTION_VIEW.equals(getIntent().getAction()) && supportedType.equals(getIntent().getType())
    {
        // Get the intent extras
        long startTime = Fitness.getStartTime(getIntent(), TimeUnit.MILLISECONDS);
        long endTime = Fitness.getEndTime(getIntent(), TimeUnit.MILLISECONDS);
        DataSource dataSource = DataSource.extract(getIntent());
    }
}

Para acessar o tipo MIME de um tipo de dados personalizado, use a constante MIME_TYPE_PREFIX:

Kotlin

val supportedType = DataType.MIME_TYPE_PREFIX + "com.company.customdatatype"

Java

String supportedType = DataType.MIME_TYPE_PREFIX + "com.company.customdatatype";

Invocar uma intent para ver dados

Para invocar uma intent de visualização de dados com outro app, use a classe HistoryApi.ViewIntentBuilder:

Kotlin

// Inside your activity
val startTime = ...
val endTime = ...
val dataSource = ...
val dataType = ...

val fitIntent = HistoryApi.ViewIntentBuilder(this, dataType)
    .setTimeInterval(startTime, endTime, TimeUnit.MILLISECONDS)
    .setDataSource(dataSource) // Optional if a specific data source is desired
    .setPreferredApplication("com.example.app") // Optional if you'd like a
    // specific app to handle the intent if that app is installed on the device
    .build()

Java

// Inside your activity
long startTime = ...
long endTime = ...
DataSource dataSource = ...
DataType dataType = ...

Intent fitIntent = new HistoryApi.ViewIntentBuilder(this, dataType)
    .setTimeInterval(startTime, endTime, TimeUnit.MILLISECONDS)
    .setDataSource(dataSource) // Optional if a specific data source is desired
    .setPreferredApplication("com.example.app") // Optional if you'd like a
    // specific app to handle the intent if that app is installed on the device
    .build();

Saiba mais sobre como usar intents e filtros de intent.