Atribuição de dados

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

Com o Google Fit, você pode fazer o seguinte:

  • Invoque uma intent para visualizar dados associados a um app específico.
  • Receber intents para mostrar dados usando seu app.
  • Descubra qual app inseriu uma sessão. Para mais mais informações, consulte Trabalhar com sessões.

Determinar qual app inseriu um ponto de dados

Para obter o nome do pacote do aplicativo que inseriu um ponto de dados, primeiro chamar DataPoint.getOriginalDataSource para obter a fonte de dados e, em seguida, chamar DataSource.getAppPackageName :

val dataPoint : DataPoint = ...
val dataSource = dataPoint.originalDataSource
val appPkgName = dataSource.appPackageName
DataPoint dataPoint = ...
DataSource dataSource = dataPoint.getOriginalDataSource();
String appPkgName = dataSource.getAppPackageName();

Receber intents de outros apps

Para registrar seu app e receber intents de outros apps de saúde e bem-estar, faça o seguinte: declarar um filtro de intent no manifesto 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 seu app recebe do Google Fit é de apenas um tipo: mas é possível filtrar por vários tipos MIME em um único filtro de intents. Do seu app o filtro de intent precisa incluir todos os tipos de dados com suporte no 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

Você pode obter dados desses extras da seguinte maneira:

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)
   
}
}
@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 obter o tipo MIME de um tipo de dados personalizado, use o MIME_TYPE_PREFIX constante:

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

Invocar uma intent para visualizar dados

Para invocar uma intent para visualizar dados com outro app, use o HistoryApi.ViewIntentBuilder classe:

// 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()
// 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 intents filtros.