Атрибуция данных

Каждая точка данных в Google Fit имеет связанный источник данных. Источники данных содержат информацию, идентифицирующую приложение или устройство, которое собирает или преобразует данные. Имя пакета приложения доступно для источников данных, которые не представляют собой физический датчик.

Google Fit позволяет вам делать следующее:

  • Вызовите намерение просмотреть данные, связанные с конкретным приложением.
  • Получите намерения показать данные с помощью вашего приложения.
  • Узнайте, какое приложение вставило сеанс . Дополнительные сведения см. в разделе Работа с сеансами .

Определите, какое приложение вставило точку данных

Чтобы получить имя пакета приложения, вставившего точку данных, сначала вызовите DataPoint.getOriginalDataSource чтобы получить источник данных, затем вызовите метод DataSource.getAppPackageName :

Котлин

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

Джава

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

Получать намерения от других приложений

Чтобы зарегистрировать свое приложение для получения намерений от других приложений для здоровья и хорошего самочувствия, объявите в манифесте фильтр намерений, аналогичный следующему:

<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>

Каждое намерение, которое ваше приложение получает от Google Fit, относится только к одному типу, но вы можете фильтровать несколько типов MIME в одном фильтре намерений. Фильтр намерений вашего приложения должен включать все типы данных, которые поддерживает ваше приложение, включая пользовательские типы данных.

Фитнес-намерения включают в себя следующие дополнения:

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

Вы можете получить данные из этих дополнений следующим образом:

Котлин

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

Чтобы получить тип MIME для пользовательского типа данных, используйте константу MIME_TYPE_PREFIX :

Котлин

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

Джава

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

Вызвать намерение просмотреть данные

Чтобы вызвать намерение просмотреть данные с помощью другого приложения, используйте класс HistoryApi.ViewIntentBuilder :

Котлин

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

Узнайте больше о том, как использовать намерения и фильтры намерений .