Статьи

Google Fit для Android: API записи

Google Fit — это платформа, которая позволяет разработчикам создавать приложения, ориентированные на данные о пригодности пользователей. Одним из инструментов, предоставляемых Google, является Google Fit для Android, который доступен в виде пакета в Сервисах Google Play.

Несмотря на то, что для Google Fit доступно множество различных API-интерфейсов, как описано в этой обзорной статье Envato Tuts + , в этом руководстве основное внимание уделяется использованию Google Fit для создания фоновых подписок с низким энергопотреблением для данных датчиков. Мы исследуем, как использовать Сервисы Google Play для хранения данных о фитнесе, чтобы к ним можно было получить доступ позже.

API-интерфейс записи отличается от API-интерфейса датчиков тем, что текущие данные датчика не доставляются в API-интерфейс записи, а скорее сохраняются в режиме онлайн для сохранения записи активности пользователя. Этот учебник включает в себя пример проекта, который вы можете скачать с GitHub .

Чтобы использовать Google Fit, вам нужно создать идентификатор клиента OAuth 2.0 и зарегистрировать свое приложение через Консоль разработчика Google. В моем руководстве по API Google Fit Sensors вы можете найти подробное объяснение того, как настроить консоль разработчика Google .

После того как ваше приложение настроено для аутентификации в консоли разработчика Google, используйте имя пакета, которое вы зарегистрировали, чтобы создать новое приложение Android с минимальным SDK 14 и пустым Activity .

После создания базового приложения для Android откройте файл build.gradle, включите сервисы Google Play в узле зависимостей и синхронизируйте свое приложение.

1
compile ‘com.google.android.gms:play-services-fitness:8.4.0’

Теперь вы сможете включать необходимые классы Google Play Services в свое приложение. Прежде чем мы углубимся в код Java для этого учебника, откройте файл activity_main.xml и изменим его так, чтобы он включал два элемента Button , которые будут использоваться для демонстрации некоторых функций API записи.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
<?xml version=»1.0″ encoding=»utf-8″?>
<LinearLayout xmlns:android=»http://schemas.android.com/apk/res/android»
    android:layout_width=»match_parent»
    android:layout_height=»match_parent»
    android:orientation=»vertical»>
 
    <Button
        android:id=»@+id/btn_show_subscriptions»
        android:layout_width=»match_parent»
        android:layout_height=»wrap_content»
        android:text=»Show Subscriptions»/>
    <Button
        android:id=»@+id/btn_cancel_subscriptions»
        android:layout_width=»match_parent»
        android:layout_height=»wrap_content»
        android:text=»Cancel Subscriptions»/>
</LinearLayout>

Когда ваше приложение будет запущено, пользовательский интерфейс будет выглядеть как на картинке ниже.

Простой пользовательский интерфейс для приложения Учебник API записи

Чтобы завершить настройку вашего проекта, откройте MainActivity.java и реализуйте следующие обратные вызовы и их необходимые методы:

  • GoogleApiClient.ConnectionCallbacks
  • GoogleAPiClient.OnConnectionFailedListener
  • View.OnClickListener

Вам также необходимо добавить переменные-члены для вашего класса, как показано ниже.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public class MainActivity extends AppCompatActivity implements
    GoogleApiClient.ConnectionCallbacks,
    GoogleApiClient.OnConnectionFailedListener,
    View.OnClickListener {
 
    private Button mCancelSubscriptionsBtn;
    private Button mShowSubscriptionsBtn;
 
    private ResultCallback<Status> mSubscribeResultCallback;
    private ResultCallback<Status> mCancelSubscriptionResultCallback;
    private ResultCallback<ListSubscriptionsResult> mListSubscriptionsResultCallback;
 
    private GoogleApiClient mGoogleApiClient;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
 
    @Override
    public void onConnected(@Nullable Bundle bundle) {
        Log.e(«RecordingAPI», «onConnected»);
    }
 
    @Override
    public void onConnectionSuspended(int i) {
        Log.e(«RecordingAPI», «onConnectionSuspended»);
    }
 
    @Override
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
        Log.e(«RecordingAPI», «onConnectionFailed»);
    }
 
    @Override
    public void onClick(View v) {
    }
}

Прежде чем вы сможете начать использовать обратные вызовы и представления, которые вы определили выше, вы должны их инициализировать. Мы делаем это, создавая два вспомогательных метода, один для инициализации представлений и один для инициализации обратных вызовов, которые вызываются в onCreate() .

Метод initViews() указывает объекты Button на определенные элементы в activity.xml и устанавливает OnClickListener для каждой кнопки.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
 
    initViews();
    initCallbacks();
}
 
private void initViews() {
    mCancelSubscriptionsBtn = (Button) findViewById(R.id.btn_cancel_subscriptions);
    mShowSubscriptionsBtn = (Button) findViewById(R.id.btn_show_subscriptions);
 
    mCancelSubscriptionsBtn.setOnClickListener(this);
    mShowSubscriptionsBtn.setOnClickListener(this);
}

В initCallbacks() все становится немного интереснее. Каждый обратный вызов используется для определенной асинхронной операции API записи. Как следует из их имен, mSubscribeResultCallback вызывается при первом добавлении подписки для датчика, mCancelSubscriptionResultCallback вызывается при отмене этой подписки, а mListSubscriptionResultCallback используется при запросе списка всех подписок.

В следующем фрагменте кода два обратных вызова, связанные с запуском и остановкой подписки, регистрируют только успех или неудачу. mListSubscriptionResultCallback получает список подписок и выводит информацию о каждой из них, получая DataType а затем каждое Field связанное с подпиской.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
private void initCallbacks() {
    mSubscribeResultCallback = new ResultCallback<Status>() {
        @Override
        public void onResult(@NonNull Status status) {
            if (status.isSuccess()) {
                if (status.getStatusCode() == FitnessStatusCodes.SUCCESS_ALREADY_SUBSCRIBED) {
                    Log.e( «RecordingAPI», «Already subscribed to the Recording API»);
                } else {
                    Log.e(«RecordingAPI», «Subscribed to the Recording API»);
                }
            }
        }
    };
 
    mCancelSubscriptionResultCallback = new ResultCallback<Status>() {
        @Override
        public void onResult(@NonNull Status status) {
            if (status.isSuccess()) {
                Log.e( «RecordingAPI», «Canceled subscriptions!»);
            } else {
                // Subscription not removed
                Log.e(«RecordingAPI», «Failed to cancel subscriptions»);
            }
        }
    };
 
    mListSubscriptionsResultCallback = new ResultCallback<ListSubscriptionsResult>() {
        @Override
        public void onResult(@NonNull ListSubscriptionsResult listSubscriptionsResult) {
            for (Subscription subscription : listSubscriptionsResult.getSubscriptions()) {
                DataType dataType = subscription.getDataType();
                Log.e( «RecordingAPI», dataType.getName() );
                for (Field field : dataType.getFields() ) {
                    Log.e( «RecordingAPI», field.toString() );
                }
            }
        }
    };
}

Теперь, когда у вас есть общая структура для вашего примера приложения, пришло время завершить все, подключившись к сервисам Google Play и запросив подписку.

В onCreate() вы можете инициализировать и подключаться к Службам Google Play, заявив, что вы используете Fitness.RECORDING_API , добавив область для чтения данных фитнес-активности и настроив ее на автоматическое подключение / отключение в течение жизненного цикла приложения.

1
2
3
4
5
6
mGoogleApiClient = new GoogleApiClient.Builder(this)
       .addApi(Fitness.RECORDING_API)
       .addScope(new Scope(Scopes.FITNESS_ACTIVITY_READ))
       .addConnectionCallbacks(this)
       .enableAutoManage(this, 0, this)
       .build();

В любое время после подключения GoogleApiClient вы можете запросить подписку. Для этого урока мы подписываемся в onConnected() . В следующем фрагменте показано, как начать подписку на изменения количества шагов пользователя, хотя вы можете получить доступ к любому датчику, который поддерживает Google Fit.

Если подписка уже выполняется из-за более раннего действия, обратный вызов получает код состояния FitnessStatusCodes.SUCCESS_ALREADY_SUBSCRIBED .

1
2
3
4
5
@Override
public void onConnected(@Nullable Bundle bundle) {
    Fitness.RecordingApi.subscribe(mGoogleApiClient, DataType.TYPE_STEP_COUNT_DELTA)
            .setResultCallback(mSubscribeResultCallback);
}

Иногда бывает полезно запросить список подписок. Ранее вы создали две кнопки для этих операций. В методе onClick() вы проверяете, какая кнопка была нажата, и выполняете соответствующее действие.

01
02
03
04
05
06
07
08
09
10
11
12
13
@Override
public void onClick(View v) {
    switch(v.getId()) {
        case R.id.btn_cancel_subscriptions: {
            cancelSubscriptions();
            break;
        }
        case R.id.btn_show_subscriptions: {
            showSubscriptions();
            break;
        }
    }
}

Если showSubscriptions() , то приложение запрашивает список подписок, связанных с API записи.

1
2
3
4
private void showSubscriptions() {
    Fitness.RecordingApi.listSubscriptions(mGoogleApiClient)
            .setResultCallback(mListSubscriptionsResultCallback);
}

Это заставляет mListSubscriptionsResultCallback выйти из всех подключенных подписок. Результат выглядит примерно так:

1
2
…/com.tutsplus.googlefitrecordingapi E/RecordingAPI: com.google.step_count.delta
…/com.tutsplus.googlefitrecordingapi E/RecordingAPI: steps(i)

Как вы можете видеть ниже, отменить подписку просто.

1
2
3
4
private void cancelSubscriptions() {
    Fitness.RecordingApi.unsubscribe(mGoogleApiClient, DataType.TYPE_STEP_COUNT_DELTA)
            .setResultCallback(mCancelSubscriptionResultCallback);
}

Теперь у вас должно быть общее представление о том, как подключиться к Google Fit из приложения для Android и работать с API записи. Хотя это может показаться не таким уж большим сейчас, но это открывает вам возможность хранить информацию о физических действиях пользователя, чтобы к ним могли обращаться другие API Google Fit в вашем приложении.