Atribución de datos

Cada dato en Google Fit tiene una fuente de datos asociada. Las fuentes de datos contienen información que identifica la app o el dispositivo que recopila o transforma los datos. El nombre del paquete de la app está disponible para fuentes de datos que no representan un sensor físico.

Google Fit te permite hacer lo siguiente:

  • Invoca un intent para ver los datos asociados a una app específica.
  • Recibe intents para mostrar datos con tu app.
  • Descubre qué app insertó una sesión. Para obtener más información, consulta Trabaja con sesiones.

Cómo determinar qué app insertó un dato

Para obtener el nombre del paquete de la aplicación que insertó un dato, primero llama a DataPoint.getOriginalDataSource a fin de obtener la fuente de datos y, luego, llama al 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();

Recibe intents de otras apps

Si quieres registrar tu app para recibir intents de otras apps de salud y bienestar, declara en el manifiesto un filtro de intents similar al siguiente:

<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 tu app recibe de Google Fit es de un solo tipo, pero puedes filtrar por varios tipos de MIME en un solo filtro de intents. El filtro de intent de tu app debe incluir todos los tipos de datos que admite la app, incluidos los tipos de datos personalizados.

Los intents de entrenamiento incluyen los siguientes elementos adicionales:

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

Puedes obtener datos de estos elementos adicionales de la siguiente manera:

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

A fin de obtener el tipo de MIME para un tipo de datos personalizado, usa la 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 un intent para ver datos

Si quieres invocar un intent para ver datos con otra app, usa la clase 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();

Obtén más información sobre cómo usar intents y filtros de intents.