Статьи

Google Fit для Android: чтение данных датчика

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

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

Чтобы использовать Google Fit для Android, вам необходимо:

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

Чтобы создать новый проект, нажмите синюю кнопку « Создать проект» в верхнем левом углу экрана.

Кнопка «Создать проект» на облачной платформе Google

Это предоставляет вам диалог, который запрашивает название проекта. Для этого урока я создал проект и назвал его TutsPlusGoogleFit . Есть некоторые ограничения на то, что вы можете назвать свой проект. Разрешены только буквы, цифры, кавычки, дефисы, пробелы и восклицательные знаки.

Новое поле именования проектов в облачной платформе Google

После нажатия кнопки « Создать » в правом нижнем углу страницы появляется диалоговое окно, указывающее, что проект создается.

Создание нового диалогового окна проекта на Google Cloud Platform

После настройки проекта вы попадете на страницу обзора проекта. Самый простой способ найти Google Fit API — это поиск по ключевому слову «fit» . Выберите Fitness API из появившихся результатов.

Окно поиска для фитнеса API

Нажмите Включить API, чтобы включить Фитнес API .

Включить кнопку API для фитнеса API

После включения Fitness API вы получите предупреждение о том, что вам также необходимо создать учетные данные для использования Fitness API. К счастью, предупреждение включает в себя кнопку, которая ведет нас на страницу учетных данных .

Перейти к кнопке учетных данных после включения фитнес-API

На странице « Учетные данные» необходимо предоставить общую информацию о приложении в мастере учетных данных . Укажите, что вы используете Fitness API , что API вызывается из приложения Android , и что приложению необходим доступ к данным пользователя .

Экран настройки учетных данных

Далее нажмите Какие учетные данные мне нужны? внизу, чтобы продолжить и создайте идентификатор клиента OAuth 2.0 для вашего приложения Android. Для этого шага вам нужны две важные части информации:

  • отпечаток сертификата
  • название пакета для приложения

Вы можете получить отпечаток сертификата подписи, открыв терминал или командную строку и перейдя к местоположению сертификата подписи вашего приложения. Это либо ключ выпуска, либо сертификат debug.keystore по умолчанию, который использует Android Studio. Перейдя в хранилище ключей, вы можете сгенерировать необходимый SHA1 с помощью следующей команды, где debug.keystore — это имя подписывающего сертификата.

1
keytool -list -v -keystore debug.keystore
Вывод данных из хранилища ключей из терминала

Вставьте ключ SHA1 в поле SHA1 и введите com.tutsplus.googlefit в поле имени пакета.

Создание идентификатора клиента OAuth 20

Наконец, вам нужно настроить экран согласия OAuth 2.0. Это экран, который отображается для пользователя, чтобы он мог предоставить вашему приложению разрешение на использование своих данных о пригодности. Этот шаг требует, чтобы ваш адрес электронной почты и название продукта отображались пользователям. Для этого урока я ввел Tuts + Google Fit .

Настройка экрана согласия API для фитнеса

Нажмите « Продолжить» и на следующей странице нажмите « Готово», чтобы завершить процесс установки.

Когда ваш проект настроен и настроен на консоли разработчика Google, вы можете приступить к созданию нового проекта Android. Убедитесь, что имя пакета совпадает с тем, которое вы ввели в консоли разработчика Google, и настройте приложение на использование платформ Phone и Tablet с минимальной версией SDK 14. Минимальный уровень API для Google Fit — 9. Создайте пустое действие для сохранения. базовый проект чист, так что вы можете сосредоточиться на Google Fit API в этом руководстве.

После настройки проекта откройте файл проекта build.gradle и импортируйте фитнес-пакет из Google Play Services, добавив следующую строку в узел dependencies .

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

Затем откройте MainActivity.java и добавьте следующие интерфейсы:

  • OnDataPointListener
  • GoogleApiClient.ConnectionCallback
  • GoogleApiClient.OnConnectionFailedListener

После добавления необходимых методов для этих интерфейсов ваш класс должен выглядеть следующим образом:

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
public class MainActivity extends AppCompatActivity implements OnDataPointListener,
        GoogleApiClient.ConnectionCallbacks,
        GoogleApiClient.OnConnectionFailedListener {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
 
    @Override
    public void onConnected(Bundle bundle) {
 
    }
 
    @Override
    public void onConnectionSuspended(int i) {
 
    }
 
    @Override
    public void onConnectionFailed(ConnectionResult connectionResult) {
 
    }
 
    @Override
    public void onDataPoint(DataPoint dataPoint) {
 
    }
}

И последнее, но не менее важное: создайте переменные-члены, которые вы будете использовать для этого урока. Вы можете скопировать следующие строки в начало класса:

1
2
3
4
private static final int REQUEST_OAUTH = 1;
private static final String AUTH_PENDING = «auth_state_pending»;
private boolean authInProgress = false;
private GoogleApiClient mApiClient;

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

После настройки проекта в Android Studio и консоли разработчика Google пришло время погрузиться в фитнес-API. В onCreate() вы проверяете, пытается ли ваше приложение выполнить авторизацию с помощью API Fitness. Затем вы инициализируете экземпляр GoogleApiClient , добавляя API-интерфейс Fitness Sensors, определяя область действия и регистрируя обратные вызовы приложения. Если вы не запросите область действия, ваше приложение не сможет авторизоваться с помощью API Fitness Sensors.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
 
    if (savedInstanceState != null) {
        authInProgress = savedInstanceState.getBoolean(AUTH_PENDING);
    }
 
    mApiClient = new GoogleApiClient.Builder(this)
            .addApi(Fitness.SENSORS_API)
            .addScope(new Scope(Scopes.FITNESS_ACTIVITY_READ_WRITE))
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .build();
 
}

После инициализации экземпляра GoogleApiClient необходимо подключить его к GoogleApiClient Google. Вы можете сделать это в onStart() .

1
2
3
4
5
@Override
protected void onStart() {
    super.onStart();
    mApiClient.connect();
}

Когда пользователь запускает приложение в первый раз, соединение с Fitness API не будет установлено, поскольку пользователь должен авторизовать ваше приложение для доступа к своим данным фитнеса. Вы можете прослушивать это событие в onConnectionFailed() и реагировать соответствующим образом, проверяя, идет ли авторизация. Если это так, вызовите startResolutionForResult() чтобы службы Google Play могли правильно обрабатывать предоставление пользователям разрешения на использование их информации.

01
02
03
04
05
06
07
08
09
10
11
12
13
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
    if( !authInProgress ) {
        try {
            authInProgress = true;
            connectionResult.startResolutionForResult( MainActivity.this, REQUEST_OAUTH );
        } catch(IntentSender.SendIntentException e ) {
 
        }
    } else {
        Log.e( «GoogleFit», «authInProgress» );
    }
}

Если вы запустите приложение сейчас, у вас может появиться диалоговое окно с просьбой выбрать учетную запись Google для использования, если вы использовали несколько учетных записей на своем устройстве.

Экран выбора электронной почты сервисов Google Play

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

Экран согласия служб Google Play

На этом этапе пользователь либо предоставляет вашему приложению разрешение на использование своих данных, либо закрывает диалоговое окно, отменяя процесс. Вы можете прослушать оба события в onActivityResult() и обработать результат. Если пользователь предоставит разрешение на ваше приложение, ваше приложение получит ответ RESULT_OK и сможет попытаться подключиться к клиенту Google API.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if( requestCode == REQUEST_OAUTH ) {
        authInProgress = false;
        if( resultCode == RESULT_OK ) {
            if( !mApiClient.isConnecting() && !mApiClient.isConnected() ) {
                mApiClient.connect();
            }
        } else if( resultCode == RESULT_CANCELED ) {
            Log.e( «GoogleFit», «RESULT_CANCELED» );
        }
    } else {
        Log.e(«GoogleFit», «requestCode NOT request_oauth»);
    }
}

Теперь ваше приложение должно успешно подключаться к сервисам Google Play. После этого вы можете сосредоточиться на фитнес-API.

Когда ваш экземпляр GoogleApiClient подключился к Google, onConnected() обратный вызов onConnected() . В этом ResultCallback вам нужно создать новый объект DataSourcesRequest который определяет тип данных, которые интересуют ваше приложение. Вам также необходимо создать ResultCallback который обрабатывает то, что приложение должно делать, если шаги могут быть получены с устройства. С созданными объектами вызовите Fitness.SensorsApi.findDataSources() чтобы начать поиск допустимого источника данных шага.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
@Override
public void onConnected(Bundle bundle) {
    DataSourcesRequest dataSourceRequest = new DataSourcesRequest.Builder()
            .setDataTypes( DataType.TYPE_STEP_COUNT_CUMULATIVE )
            .setDataSourceTypes( DataSource.TYPE_RAW )
            .build();
 
    ResultCallback<DataSourcesResult> dataSourcesResultCallback = new ResultCallback<DataSourcesResult>() {
        @Override
        public void onResult(DataSourcesResult dataSourcesResult) {
            for( DataSource dataSource : dataSourcesResult.getDataSources() ) {
                if( DataType.TYPE_STEP_COUNT_CUMULATIVE.equals( dataSource.getDataType() ) ) {
                    registerFitnessDataListener(dataSource, DataType.TYPE_STEP_COUNT_CUMULATIVE);
                }
            }
        }
    };
 
    Fitness.SensorsApi.findDataSources(mApiClient, dataSourceRequest)
            .setResultCallback(dataSourcesResultCallback);
}

Вы можете заметить, что метод registerFitnessDataListener() самом деле не существует. Это вспомогательный метод, который вызывается при обнаружении источника данных для счетчика шагов, который затем создает объект SensorRequest для запроса данных от датчика количества шагов.

В следующем фрагменте SensorRequest объект SensorRequest пытается найти число шагов каждые три секунды. Затем Fitness.SensorApi добавляет запрос с новым OnDataPointListener чтобы при появлении новых данных OnDataPointListener слушатель. Если новые данные не найдены, OnDataPointListener не запускается, и Fitness API ждет еще три секунды, прежде чем проверять снова.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
private void registerFitnessDataListener(DataSource dataSource, DataType dataType) {
 
    SensorRequest request = new SensorRequest.Builder()
            .setDataSource( dataSource )
            .setDataType( dataType )
            .setSamplingRate( 3, TimeUnit.SECONDS )
            .build();
 
    Fitness.SensorsApi.add( mApiClient, request, this )
            .setResultCallback(new ResultCallback<Status>() {
                @Override
                public void onResult(Status status) {
                    if (status.isSuccess()) {
                        Log.e( «GoogleFit», «SensorApi successfully added» );
                    }
                }
            });
}

При обнаружении изменения количества шагов вызывается onDataPoint() . В этом методе вы просматриваете поля в параметре DataPoint и DataPoint сообщение Toast с именем и значением поля. В этом примере это будет счетчик шагов. В ваших собственных приложениях вы будете использовать более подходящую логику для выполнения своей задачи. Вы заметите, что команда Toast заключена в Runnable который передается в runOnUiThread . Это потому, что обратный вызов не запускается в основном потоке пользовательского интерфейса.

01
02
03
04
05
06
07
08
09
10
11
12
@Override
public void onDataPoint(DataPoint dataPoint) {
    for( final Field field : dataPoint.getDataType().getFields() ) {
        final Value value = dataPoint.getValue( field );
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(getApplicationContext(), «Field: » + field.getName() + » Value: » + value, Toast.LENGTH_SHORT).show();
            }
        });
    }
}
Тост-сообщение с выводом данных шагов

Есть еще две вещи, которые вам нужно сделать для этого образца. Первое — это отключение от SensorApi и Google Play Services, когда вы закончите пользоваться ими. В этом примере вы делаете это, когда onStop() . Второй хранит значение authInProgress которое проверяется onCreate() в onSavedInstanceState() .

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
@Override
protected void onStop() {
    super.onStop();
 
    Fitness.SensorsApi.remove( mApiClient, this )
            .setResultCallback(new ResultCallback<Status>() {
                @Override
                public void onResult(Status status) {
                    if (status.isSuccess()) {
                        mApiClient.disconnect();
                    }
                }
            });
}
 
@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putBoolean(AUTH_PENDING, authInProgress);
}

В этом руководстве вы узнали, как подключиться к API-интерфейсу Google Play Services Fitness и считывать данные датчика пригодности с устройства пользователя. Даже такие простые вещи, как данные о шагах для вашего пользователя, могут оказаться невероятно ценными для таких приложений, как циферблаты Android Wear или трекеры целей. Есть десятки других типов источников данных, которые вы можете использовать, и множество других API в Google Fit, чтобы сделать ваши приложения еще лучше.