Atribución de datos

Cada dato de Google Fit tiene una fuente de datos asociada. Fuentes de datos contienen información que identifica a la aplicación o al dispositivo que recopila o transforma los datos. El nombre del paquete de la app está disponible para las 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 con una app específica.
  • Recibir intents para mostrar datos con tu app
  • Descubre qué app insertó una sesión. Para ver más consulta Cómo trabajar con sesiones.

Determina qué app insertó un dato

Para obtener el nombre del paquete de la aplicación que insertó un dato, primero llamar a DataPoint.getOriginalDataSource para obtener la fuente de datos y, luego, llama al DataSource.getAppPackageName método:

Kotlin

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

Java

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

Cómo recibir intents de otras apps

Si quieres registrar tu app para que reciba intents de otras apps de salud y bienestar, sigue estos pasos: declara un filtro de intents en tu manifiesto que sea 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 la aplicación recibe de Google Fit es de un solo tipo, pero puedes filtrar varios tipos de MIME en un solo filtro de intents. La duración de el filtro de intents debe incluir todos los tipos de datos que admite tu app incluidos los tipos de datos personalizados.

Los intents de entrenamiento incluyen los siguientes extras:

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

Puedes obtener datos de estos extras 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());
    }
}

Para obtener el tipo MIME de un tipo de datos personalizado, utiliza la MIME_TYPE_PREFIX constante:

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 deseas invocar un intent para ver datos con otra app, usa el elemento HistoryApi.ViewIntentBuilder clase:

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 e intents filtros.