Obsługa dodatkowych czujników

Urządzenia fitness ze standardowym profilem Bluetooth Low Energy GATT są automatycznie obsługiwane przez Google Fit. Jeśli Twoje urządzenie nie ma takiego profilu, możesz utworzyć aplikację na Androida, która będzie zarządzać komunikacją z urządzeniem do fitnessu i udostępnia ją Google Fit jako czujnik programowy. Możesz też udostępnić własne czujniki oprogramowania w aplikacji.

Aby utworzyć czujnik programowy w aplikacji, rozszerzysz klasę FitnessSensorService i zadeklarujesz ją jako usługę w pliku manifestu. Gdy użytkownicy instalują Twoją aplikację, Google Fit udostępnia czujniki oprogramowania innym aplikacjom. Gdy aplikacja zarejestruje się, by otrzymywać dane z oprogramowania z czujnika, Google Fit połączy się z Twoją usługą.

Deklarowanie usługi czujnika

Aby zdefiniować czujnik oprogramowania, zadeklaruj FitnessSensorService w pliku manifestu aplikacji:

<service android:name="com.example.MySensorService"
         android:process=":sensor">
  <intent-filter>
    <action android:name="com.google.android.gms.fitness.service.FitnessSensorService" />
    <!-- include at least one mimeType filter for the supported data types -->
    <data android:mimeType="vnd.google.fitness.data_type/com.google.heart_rate.bpm" />
  </intent-filter>
</service>

Usługa w tym przykładzie działa w osobnym procesie określonym w atrybucie android:process. Więcej informacji znajdziesz w artykule Procesy.

Wdróż usługę czujników

Aby wdrożyć czujnik programowy, rozszerz klasę FitnessSensorService i zaimplementuj jej metody abstrakcyjne. Szczegóły implementacji zależą od konkretnego przypadku użycia, ale ogólny przykład zawiera ogólne wskazówki:

Kotlin

class MySensorService : FitnessSensorService() {
    override fun onCreate() {
        super.onCreate()
        // 1. Initialize your software sensor(s).
        // 2. Create DataSource representations of your software sensor(s).
        // 3. Initialize some data structure to keep track of a registration
        // for each sensor.
    }

    override fun onFindDataSources(dataTypes: List<DataType>): List<DataSource> {
        // 1. Find which of your software sensors provide the data types requested.
        // 2. Return those as a list of DataSource objects.
    }

    override fun onRegister(request: FitnessSensorServiceRequest): Boolean {
        // 1. Determine which sensor to register with request.dataSource.
        // 2. If a registration for this sensor already exists, replace it with
        //    this one.
        // 3. Keep (or update) a reference to the request object.
        // 4. Configure your sensor according to the request parameters.
        // 5. When the sensor has new data, deliver it to the platform by
        //    calling request.dispatcher.publish(dataPoints)
    }

    override fun onUnregister(dataSource: DataSource): Boolean {
        // 1. Configure this sensor to stop delivering data to the platform
        // 2. Discard the reference to the registration request object
    }
}

Java

public class MySensorService extends FitnessSensorService {
    @Override
    public void onCreate() {
        super.onCreate();
        // 1. Initialize your software sensor(s).
        // 2. Create DataSource representations of your software sensor(s).
        // 3. Initialize some data structure to keep track of a registration
        //    for each sensor.
    }

    @NonNull
    @Override
    public List<DataSource> onFindDataSources(@NonNull List<DataType> list) {
        // 1. Find which of your software sensors provide the data types
        //    requested.
        // 2. Return those as a list of DataSource objects.
    }

    @Override
    public boolean onRegister(
            @NonNull FitnessSensorServiceRequest fitnessSensorServiceRequest) {
        // 1. Determine which sensor to register with request.dataSource.
        // 2. If a registration for this sensor already exists, replace it with
        //    this one.
        // 3. Keep (or update) a reference to the request object.
        // 4. Configure your sensor according to the request parameters.
        // 5. When the sensor has new data, deliver it to the platform by
        //    calling request.getDispatcher.publish(dataPoints);
    }

    @Override
    public boolean onUnregister(@NonNull DataSource dataSource) {
        // 1. Configure this sensor to stop delivering data to the platform
        // 2. Discard the reference to the registration request object
    }
}