Вступление
Google Fit — это платформа, которая позволяет разработчикам создавать приложения, ориентированные на данные о пригодности пользователей. Одним из инструментов, предоставляемых Google, является Google Fit для Android, который доступен в виде пакета в Сервисах Google Play.
Несмотря на то, что для Google Fit доступно множество различных API-интерфейсов, как описано в этой обзорной статье Envato Tuts + , в этом руководстве основное внимание уделено настройке и использованию Google Fit для чтения данных датчиков на устройстве Android. Пример проекта для этого урока можно найти на GitHub .
1. Настройка консоли разработчика
Чтобы использовать Google Fit для Android, вам необходимо:
- включите Fitness API в консоли разработчиков Google
- создать идентификатор клиента OAuth 2.0
- подключиться к Fitness API в вашем приложении для Android
В этом разделе показано, как настроить приложение Android и API Fitness. Вы можете начать с посещения консоли разработчиков Google . Если у вас уже есть проект для работы, вы можете пропустить следующий шаг. Если нет, то следуйте инструкциям и создайте новый проект для своего приложения Google Fit.
Шаг 1: Создать проект
Чтобы создать новый проект, нажмите синюю кнопку « Создать проект» в верхнем левом углу экрана.
Это предоставляет вам диалог, который запрашивает название проекта. Для этого урока я создал проект и назвал его TutsPlusGoogleFit . Есть некоторые ограничения на то, что вы можете назвать свой проект. Разрешены только буквы, цифры, кавычки, дефисы, пробелы и восклицательные знаки.
После нажатия кнопки « Создать » в правом нижнем углу страницы появляется диалоговое окно, указывающее, что проект создается.
Шаг 2. Включите Google Fit API
После настройки проекта вы попадете на страницу обзора проекта. Самый простой способ найти Google Fit API — это поиск по ключевому слову «fit» . Выберите Fitness API из появившихся результатов.
Нажмите Включить API, чтобы включить Фитнес API .
После включения Fitness API вы получите предупреждение о том, что вам также необходимо создать учетные данные для использования Fitness API. К счастью, предупреждение включает в себя кнопку, которая ведет нас на страницу учетных данных .
Шаг 3. Создание учетных данных
На странице « Учетные данные» необходимо предоставить общую информацию о приложении в мастере учетных данных . Укажите, что вы используете 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 2.0. Это экран, который отображается для пользователя, чтобы он мог предоставить вашему приложению разрешение на использование своих данных о пригодности. Этот шаг требует, чтобы ваш адрес электронной почты и название продукта отображались пользователям. Для этого урока я ввел Tuts + Google Fit .
Нажмите « Продолжить» и на следующей странице нажмите « Готово», чтобы завершить процесс установки.
Шаг 4. Настройка проекта Android
Когда ваш проект настроен и настроен на консоли разработчика 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 и узнаете, как получить доступ к данным о пригодности пользователя в вашем приложении.
2. Использование Fitness API
Шаг 1. Подключение к сервисам 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 для использования, если вы использовали несколько учетных записей на своем устройстве.
Когда операционная система знает, какую учетную запись использовать, ваше приложение открывает новое диалоговое окно, в котором пользователь просит предоставить приложению разрешение на чтение данных о пригодности.
На этом этапе пользователь либо предоставляет вашему приложению разрешение на использование своих данных, либо закрывает диалоговое окно, отменяя процесс. Вы можете прослушать оба события в 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.
Шаг 2. Доступ к данным шага с помощью Fitness 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, чтобы сделать ваши приложения еще лучше.