Статьи

Сервисы Google Play: API Awareness

Создание приложения с учетом контекста является одним из лучших способов предложить полезные услуги для ваших пользователей. Хотя до сих пор существует несколько способов сделать это, включая геозоны , распознавание активности и другие службы определения местоположения, Google недавно выпустила API Awareness , который позволяет разработчикам создавать приложения, которые интеллектуально реагируют на ситуацию в реальном мире пользователя. Awareness API объединяет API Places, API Locations, Распознавание активности и API Nearby, а также добавляет поддержку для состояния наушников и определения погоды.

В этом руководстве вы узнаете об API Awareness и о том, как получить доступ к моментальным снимкам данных, а также о том, как создавать прослушиватели (известные как заборы , взявшие свое имя из геозон) для комбинаций пользовательских условий, которые соответствуют целям ваших приложений. Это может быть полезно для широкого спектра приложений, таких как основанные на местоположении игры, предлагая купоны для пользователей в магазинах и запуска музыкального приложения, когда вы обнаруживаете упражнение пользователя. Весь код для этого примера приложения можно найти на GitHub.

Перед тем, как погрузиться в приложение Android, вам необходимо настроить Сервисы Google Play через Консоль Google API . Если у вас уже есть проект, вы можете пропустить первый шаг этого раздела. Если нет, вы можете нажать на ссылку выше и следовать, чтобы создать новый проект для вашего приложения.

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

Консоль Google API Создать проект

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

Консоль Google API Новый экран создания проекта

После нажатия кнопки « Создать » в правом нижнем углу страницы появится диалоговое окно, указывающее, что проект создается. Как только он исчезнет, ​​ваш проект будет доступен для настройки. Вы должны увидеть экран, подобный следующему. Если нет, нажмите на логотип API Google в верхнем левом углу, чтобы перейти на экран менеджера API.

Экран Google Console Overview

На экране обзора API Google выберите поле поиска и выполните поиск Awareness API.

Консоль API Google Enable Awareness API

После того, как вы выбрали Awareness API из полученных результатов, нажмите синюю кнопку Включить , чтобы ваше приложение могло использовать Awareness API. Если это первый API, который вы включили, вам будет предложено создать набор учетных данных. Перейдите на страницу « Учетные данные» для шага 3 этого руководства.

Консоль Google API Перейти к расположению кнопки «Учетные данные»

В дополнение к Awareness API, вам может потребоваться включить дополнительные API. Если ваше приложение использует функции Адресов API Awareness, вам необходимо включить API Google Адресов для Android .

Консоль Google API Включить Places API

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

Чтобы использовать включенные API, вам необходимо сгенерировать ключ API для вашего приложения Android. На странице учетных данных для вашего проекта Google выберите Awareness API в верхнем раскрывающемся меню и Android во втором.

Консоль Google API Добавьте учетные данные в свой проект

Затем вы попадете на экран, где вы можете ввести имя пакета для вашего приложения и сертификат SHA1 для ключа подписи приложения. Чтобы получить ключ подписи для вашего ключа отладки в Linux или OS X, введите следующую команду в окне терминала.

1
keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android

В Windows вы можете запустить ту же команду, указав путь к файлу debug.keystore .

Консоль Google API Добавьте отпечаток SHA1 и имя пакета в проект

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

Ключ API Google API Console

После того, как вы создали ключ API и включили соответствующие API, пришло время приступить к настройке вашего проекта Android. Для этого урока мы создадим тестовое приложение для изучения API.

Чтобы продемонстрировать все функции API Awareness, в этом руководстве будет использоваться простой список, представляющий каждую используемую функцию. Хотя детали создания этого списка не будут обсуждаться, вы можете найти полную реализацию в исходном коде GitHub для этого руководства .

Сначала вам нужно будет включить библиотеку Play Services в ваш файл build.gradle . Хотя вы можете включить все сервисы Google Play, лучше всего включать только те пакеты, которые необходимы для вашего приложения.

В этом случае Awareness API доступен в пакете ContextManager , и его можно включить в ваш проект, добавив следующую строку в ваш узел зависимостей . Вы также должны убедиться, что библиотека AppCompat включена, так как она будет использоваться для проверки разрешений на устройствах Marshmallow и выше.

1
2
compile ‘com.google.android.gms:play-services-contextmanager:9.2.0’
compile ‘com.android.support:appcompat-v7:23.4.0’

После того как вы добавили вышеуказанную строку, синхронизируйте ваш проект и откройте файл strings.xml для вашего проекта. Вы захотите поместить свой ключ API из консоли API Google в строковое значение.

1
<string name=»google_play_services_key»>YOUR API KEY HERE</string>

После того, как вы добавили свой ключ API, вам нужно открыть файл AndroidManifest.xml вашего проекта. В зависимости от того, какие функции Awareness API вы используете, вам нужно будет включить разрешения для вашего приложения. Если ваше приложение использует функции маяка, местоположения, местоположения или погоды API-интерфейса Awareness, вам нужно будет включить Разрешение ACCESS_FINE_LOCATION . Если вам нужно использовать функцию распознавания активности, вам потребуется разрешение ACTIVITY_RECOGNITION .

1
2
<uses-permission android:name=»android.permission.ACCESS_FINE_LOCATION» />
<uses-permission android:name=»com.google.android.gms.permission.ACTIVITY_RECOGNITION» />

Затем вам нужно будет объявить meta-data внутри узла application , связывающего ваше приложение со службами API Google. В зависимости от того, что использует ваше приложение, вам также необходимо включить метаданные com.google.android.geo и com.google.android.nearby для использования функций определения местоположения, маяков и мест.

01
02
03
04
05
06
07
08
09
10
11
12
13
<meta-data
    android:name=»com.google.android.awareness.API_KEY»
    android:value=»@string/google_play_services_key» />
 
<!— places/location declaration —>
<meta-data
    android:name=»com.google.android.geo.API_KEY»
    android:value=»@string/google_play_services_key» />
 
<!— Beacon snapshots/fences declaration —>
<meta-data
    android:name=»com.google.android.nearby.messages.API_KEY»
    android:value=»@string/google_play_services_key» />

Затем вам нужно будет открыть файл MainActivity.java . Добавьте интерфейс GoogleApiClient.OnConnectionFailedListener к своему классу и подключитесь к сервисам Google Play и API Awareness в своем onCreate(Bundle) .

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
public class MainActivity extends AppCompatActivity implements
        GoogleApiClient.OnConnectionFailedListener {
             
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addApi(Awareness.API)
                .enableAutoManage(this, this)
                .build();
        mGoogleApiClient.connect();
    }
     
    @Override
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {}
}

Теперь, когда сервисы Play настроены в вашем приложении Android, вам нужно будет убедиться, что ваши пользователи на Android Marshmallow или выше предоставили разрешение вашему приложению использовать их местоположение. Вы можете проверить это разрешение в onCreate(Bundle) и перед тем, как получить доступ к любым функциям, требующим разрешения для определения местоположения во избежание сбоев в вашем приложении.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
private boolean checkLocationPermission() {
    if( !hasLocationPermission() ) {
        Log.e(«Tuts+», «Does not have location permission granted»);
        requestLocationPermission();
        return false;
    }
 
    return true;
}
 
private boolean hasLocationPermission() {
    return ContextCompat.checkSelfPermission( this, Manifest.permission.ACCESS_FINE_LOCATION )
            == PackageManager.PERMISSION_GRANTED;
}

Если разрешение на местоположение еще не было предоставлено, вы можете запросить, чтобы пользователь предоставил его.

1
2
3
4
5
6
7
8
private final static int REQUEST_PERMISSION_RESULT_CODE = 42;
 
private void requestLocationPermission() {
    ActivityCompat.requestPermissions(
            MainActivity.this,
            new String[]{ Manifest.permission.ACCESS_FINE_LOCATION },
            REQUEST_PERMISSION_RESULT_CODE );
}

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

Диалог разрешений для местоположения

Когда пользователь ответил, onRequestPermissionsResult() вызов onRequestPermissionsResult() получит результаты, и ваше приложение может ответить соответствующим образом.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[],
                                       @NonNull int[] grantResults) {
    switch (requestCode) {
        case REQUEST_PERMISSION_RESULT_CODE: {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                //granted
            } else {
                Log.e(«Tuts+», «Location permission denied.»);
            }
        }
    }
}

На этом этапе вы должны закончить настройку приложения для использования Awareness API.

Если вы хотите собрать информацию о текущем контексте пользователя, вы можете использовать функцию снимка API Awareness. Этот API будет собирать информацию в зависимости от типа выполняемого вызова API и будет кэшировать эту информацию для быстрого доступа к различным приложениям.

Одним из новых дополнений к сервисам Play через Awareness API является возможность определения состояния наушников устройства (подключено или отключено). Это можно сделать, вызвав getHeadphoneState() в Awareness API и прочитав HeadphoneState из HeadphoneStateResult .

01
02
03
04
05
06
07
08
09
10
11
12
13
14
private void detectHeadphones() {
    Awareness.SnapshotApi.getHeadphoneState(mGoogleApiClient)
            .setResultCallback(new ResultCallback<HeadphoneStateResult>() {
                @Override
                public void onResult(@NonNull HeadphoneStateResult headphoneStateResult) {
                    HeadphoneState headphoneState = headphoneStateResult.getHeadphoneState();
                    if (headphoneState.getState() == HeadphoneState.PLUGGED_IN) {
                        Log.e(«Tuts+», «Headphones are plugged in.»);
                    } else {
                        Log.e(«Tuts+», «Headphones are NOT plugged in.»);
                    }
                }
            });
}

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

Несмотря на то, что ранее доступный как компонент в Сервисах Google Play, функция определения местоположения API Awareness была оптимизирована для эффективности и использования батареи. Вместо того, чтобы использовать традиционный API определения местоположения и получать местоположение с заданными интервалами, вы можете запросить одноразовый снимок местоположения следующим образом.

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
private void detectLocation() {
    if( !checkLocationPermission() ) {
        return;
    }
 
    Awareness.SnapshotApi.getLocation(mGoogleApiClient)
            .setResultCallback(new ResultCallback<LocationResult>() {
                @Override
                public void onResult(@NonNull LocationResult locationResult) {
                    Location location = locationResult.getLocation();
 
                    Log.e(«Tuts+», «Latitude: » + location.getLatitude() + «, Longitude: » + location.getLongitude());
 
                    Log.e(«Tuts+», «Provider: » + location.getProvider() + » time: » + location.getTime());
 
                    if( location.hasAccuracy() ) {
                        Log.e(«Tuts+», «Accuracy: » + location.getAccuracy());
                    }
                    if( location.hasAltitude() ) {
                        Log.e(«Tuts+», «Altitude: » + location.getAltitude());
                    }
                    if( location.hasBearing() ) {
                        Log.e(«Tuts+», «Bearing: » + location.getBearing());
                    }
                    if( location.hasSpeed() ) {
                        Log.e(«Tuts+», «Speed: » + location.getSpeed());
                    }
                }
            });
}

Как вы можете видеть, вам сначала нужно убедиться, что пользователь предоставил разрешение на местоположение. Если они есть, вы можете извлечь стандартный объект Location с большим количеством данных о местоположении и скорости пользователя, а также информацию о точности этих данных.

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

1
2
3
4
5
E/Tuts+: Latitude: 39.9255456, Longitude: -105.02939579999999
E/Tuts+: Provider: Snapshot time: 1468696704662
E/Tuts+: Accuracy: 20.0
E/Tuts+: Altitude: 0.0
E/Tuts+: Speed: 0.0

Хотя API Awareness не настолько надежен, как стандартный API Places , он обеспечивает быстрый и простой способ сбора информации о местах рядом с пользователем. Этот вызов API вернет List объектов PlaceLikelihood который содержит Place и число с float представляющее, насколько вероятно, что пользователь находится в этом месте (отсюда и имя объекта).

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
private void detectNearbyPlaces() {
    if( !checkLocationPermission() ) {
        return;
    }
 
    Awareness.SnapshotApi.getPlaces(mGoogleApiClient)
            .setResultCallback(new ResultCallback<PlacesResult>() {
                @Override
                public void onResult(@NonNull PlacesResult placesResult) {
                    Place place;
                    for( PlaceLikelihood placeLikelihood : placesResult.getPlaceLikelihoods() ) {
                        place = placeLikelihood.getPlace();
                        Log.e(«Tuts+», place.getName().toString() + «\n» + place.getAddress().toString() );
                        Log.e(«Tuts+», «Rating: » + place.getRating() );
                        Log.e(«Tuts+», «Likelihood that the user is here: » + placeLikelihood.getLikelihood() * 100 + «%»);
                    }
                }
            });
}

При запуске вышеуказанного метода вы должны увидеть вывод, похожий на следующий в консоли Android. Если значение не доступно для числа, возвращается -1 .

01
02
03
04
05
06
07
08
09
10
11
E/Tuts+: North Side Tavern
         12708 Lowell Blvd, Broomfield, CO 80020, USA
E/Tuts+: Rating: 4.7
E/Tuts+: Likelihood that the user is here: 10.0%
E/Tuts+: Quilt Store
         12710 Lowell Blvd, Broomfield, CO 80020, USA
E/Tuts+: Rating: 4.3
E/Tuts+: Likelihood that the user is here: 10.0%
E/Tuts+: Absolute Floor Care
         3508 W 126th Pl, Broomfield, CO 80020, USA
E/Tuts+: Rating: -1.0

Еще одним новым дополнением к Сервисам Google Play через Awareness API является возможность получать погодные условия для пользователя. Эта функция также требует разрешения местоположения для пользователей на Зефир и позже.

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
private void detectWeather() {
    if( !checkLocationPermission() ) {
        return;
    }
 
    Awareness.SnapshotApi.getWeather(mGoogleApiClient)
            .setResultCallback(new ResultCallback<WeatherResult>() {
                @Override
                public void onResult(@NonNull WeatherResult weatherResult) {
                    Weather weather = weatherResult.getWeather();
                    Log.e(«Tuts+», «Temp: » + weather.getTemperature(Weather.FAHRENHEIT));
                    Log.e(«Tuts+», «Feels like: » + weather.getFeelsLikeTemperature(Weather.FAHRENHEIT));
                    Log.e(«Tuts+», «Dew point: » + weather.getDewPoint(Weather.FAHRENHEIT));
                    Log.e(«Tuts+», «Humidity: » + weather.getHumidity() );
 
                    if( weather.getConditions()[0] == Weather.CONDITION_CLOUDY ) {
                        Log.e(«Tuts+», «Looks like there’s some clouds out there»);
                    }
                }
            });
}

Приведенный выше код должен выводить что-то похожее на это.

1
2
3
4
5
E/Tuts+: Temp: 88.0
E/Tuts+: Feels like: 88.0
E/Tuts+: Dew point: 50.0
E/Tuts+: Humidity: 28
E/Tuts+: Looks like there’s some clouds out there

Здесь важно отметить, что значение погодных условий хранится как int . Весь список значений условий можно найти в объекте Погода.

01
02
03
04
05
06
07
08
09
10
int CONDITION_UNKNOWN = 0;
int CONDITION_CLEAR = 1;
int CONDITION_CLOUDY = 2;
int CONDITION_FOGGY = 3;
int CONDITION_HAZY = 4;
int CONDITION_ICY = 5;
int CONDITION_RAINY = 6;
int CONDITION_SNOWY = 7;
int CONDITION_STORMY = 8;
int CONDITION_WINDY = 9;

Деятельность вашего пользователя будет играть большую роль в том, как они взаимодействуют со своим устройством, и обнаружение этой активности позволит вам обеспечить более плавное взаимодействие с пользователем.

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

Используя getDetectedActivity() в Awareness API, вы можете получить список вероятных действий и длительность выполнения каждого из них.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
private void detectActivity() {
    Awareness.SnapshotApi.getDetectedActivity(mGoogleApiClient)
            .setResultCallback(new ResultCallback<DetectedActivityResult>() {
                @Override
                public void onResult(@NonNull DetectedActivityResult detectedActivityResult) {
                    ActivityRecognitionResult result = detectedActivityResult.getActivityRecognitionResult();
                    Log.e(«Tuts+», «time: » + result.getTime());
                    Log.e(«Tuts+», «elapsed time: » + result.getElapsedRealtimeMillis());
                    Log.e(«Tuts+», «Most likely activity: » + result.getMostProbableActivity().toString());
 
                    for( DetectedActivity activity : result.getProbableActivities() ) {
                        Log.e(«Tuts+», «Activity: » + activity.getType() + » Likelihood: » + activity.getConfidence() );
                    }
                }
            });
}

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

1
2
3
4
E/Tuts+: time: 1468701845962
E/Tuts+: elapsed time: 15693985
E/Tuts+: Most likely activity: DetectedActivity [type=STILL, confidence=100]
E/Tuts+: Activity: 3 Likelihood: 100

Значения типа DetectedActivity могут быть сопоставлены со следующими значениями:

1
2
3
4
5
6
7
8
int IN_VEHICLE = 0;
int ON_BICYCLE = 1;
int ON_FOOT = 2;
int STILL = 3;
int UNKNOWN = 4;
int TILTING = 5;
int WALKING = 7;
int RUNNING = 8;

Последний тип снимка — и его сложнее всего настроить, поскольку для него требуется компонент реального мира, — включает маяки BLE ( B luetooth L ow E nergy). Хотя API-интерфейс Nearby выходит за рамки этого учебного пособия, вы можете инициализировать маяки для своего проекта Google Services с помощью приложения Google Beacon Tools .

Настроенный маяк в приложении Beacon Tools

Важно отметить, что после регистрации маяка в проекте API Google вы не можете отменить его регистрацию без сброса идентификатора маяка . Это означает, что если вы удалите этот проект, маяк нужно будет перенастроить с помощью приложения вашего производителя. Для API Awareness пространство имен должно соответствовать проекту Google, который вы используете для своих вызовов API Awareness. Приведенный выше маяк уже был зарегистрирован в персональном тестовом проекте Google, поэтому пространство имен ( reflected-disk-355 ) отличается от пространства имен образца проекта, связанного с этим учебным пособием.

На скриншоте выше вы можете увидеть один элемент в разделе « Приложения» . Пространство имен для этого вложения — отражение-диск-355 (пространство имен проекта примера учебника — tutsplusawareness ), и тип находится поблизости . Эта информация понадобится вам для ваших собственных маяков, чтобы обнаруживать вложения с помощью Awareness API.

Когда у вас настроены маяки, вы можете вернуться к своему коду. Вам нужно будет создать List объектов BeaconState.TypeFilter чтобы ваше приложение могло отфильтровывать маяки и вложения, которые не относятся к вашему приложению.

1
2
3
4
5
private static final List BEACON_TYPE_FILTERS = Arrays.asList(
       BeaconState.TypeFilter.with(
            //replace these with your beacon’s values
               «namespace»,
               «type») );

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
private void detectBeacons() {
    if( !checkLocationPermission() ) {
        return;
    }
 
    Awareness.SnapshotApi.getBeaconState(mGoogleApiClient, BEACON_TYPE_FILTERS)
            .setResultCallback(new ResultCallback<BeaconStateResult>() {
                @Override
                public void onResult(@NonNull BeaconStateResult beaconStateResult) {
                    if (!beaconStateResult.getStatus().isSuccess()) {
                        Log.e(«Test», «Could not get beacon state.»);
                        return;
                    }
                    BeaconState beaconState = beaconStateResult.getBeaconState();
                    if( beaconState == null ) {
                        Log.e(«Tuts+», «beacon state is null»);
                    } else {
                        for(BeaconState.BeaconInfo info : beaconState.getBeaconInfo()) {
                            Log.e(«Tuts+», new String(info.getContent()));
                        }
                    }
                }
            });
}

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

1
2
E/Tuts+: Oh hi tuts+
E/Tuts+: Portable Beacon info

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

Существует пять типов условий, которые вы можете проверить при создании заборов:

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

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

1
private final static String KEY_SITTING_AT_HOME = «sitting_at_home»;

После того как вы определили ключ, вы можете прослушать Intent вещания, которое содержит этот ключ.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
public class FenceBroadcastReceiver extends BroadcastReceiver {
 
    @Override
    public void onReceive(Context context, Intent intent) {
        if(TextUtils.equals(ACTION_FENCE, intent.getAction())) {
            FenceState fenceState = FenceState.extract(intent);
 
            if( TextUtils.equals(KEY_SITTING_AT_HOME, fenceState.getFenceKey() ) ) {
                if( fenceState.getCurrentState() == FenceState.TRUE ) {
                    Log.e(«Tuts+», «You’ve been sitting at home for too long»);
                }
            }
        }
    }
}

Теперь, когда у вас есть приемник, созданный для прослушивания пользовательских событий, пришло время создать ваши заборы. Первый AwarenessFence вы создадите, будет прослушивать, когда пользователь находится в состоянии STILL .

1
AwarenessFence activityFence = DetectedActivityFence.during(DetectedActivityFence.STILL);

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

1
AwarenessFence homeFence = LocationFence.in(39.92, -105.7, 100000, 1000 );

Теперь, когда у вас есть два забора, вы можете объединить их для создания третьего AwarenessFence с помощью операции AwarenessFence.and .

1
AwarenessFence sittingAtHomeFence = AwarenessFence.and(homeFence, activityFence);

Наконец, вы можете создать PendingIntent который будет транслироваться вашему BroadcastReceiver и добавить его в API Awareness, используя метод updateFences .

01
02
03
04
05
06
07
08
09
10
Intent intent = new Intent(ACTION_FENCE);
PendingIntent fencePendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0);
 
mFenceBroadcastReceiver = new FenceBroadcastReceiver();
registerReceiver(mFenceBroadcastReceiver, new IntentFilter(ACTION_FENCE));
 
FenceUpdateRequest.Builder builder = new FenceUpdateRequest.Builder();
builder.addFence(KEY_SITTING_AT_HOME, sittingAtHomeFence, fencePendingIntent);
 
Awareness.FenceApi.updateFences( mGoogleApiClient, builder.build() );

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

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

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