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.