Android Geofencing BroadcastReceiver не запущен

В настоящее время я делаю приложение Geofencing для Android и следовал их руководству, но я не могу заставить BroadcastReceiver правильно запускаться.

Вызывается onAddGeofencesResult, но BroadcastReceiver никогда не вызывается. И идея почему? У меня так, что должна быть рассылка, если человек находится в геозоне более 5 мс, а так же выходит или входит в геозону. Я сделал геозоны по координатам прямо возле своего офиса, но при проходе через них (или стоянии в них) никакого результата.

ReceiveTransitionsBroadcastReceiver.java:

import com.parse.ParseObject;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;


/**
 * This class receives geofence transition events from Location Services, in the
 * form of an Intent containing the transition type and geofence id(s) that triggered
 * the event.
 */
public class ReceiveTransitionsBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context arg0, Intent arg1) {

        System.out.println("Hello");

        ParseObject gameScore = new ParseObject("EventTest");
        gameScore.put("Student", "Josh");
        gameScore.put("Entered", true);
        gameScore.put("Class", "AndroidTest");
        gameScore.saveInBackground();

    }
}

Манифест:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.spotter"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="16"
        android:targetSdkVersion="19" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.spotter.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <receiver android:name="com.example.spotter.ReceiveTransitionsBroadcastReceiver" android:exported="false"/>
        <meta-data
        android:name="com.google.android.gms.version"
        android:value="@integer/google_play_services_version" />
    </application>
</manifest>

MainActivity, где я настроил геозоны:

@Override
public void onConnected(Bundle bundle) {
    System.out.println("Connected to LocationServices");
    Geofence.Builder builder = new Geofence.Builder();
    builder.setCircularRegion(41.909858, -87.649038, 100.0f)
        .setExpirationDuration(Geofence.NEVER_EXPIRE)
        .setRequestId("1")
        .setLoiteringDelay(5)
        .setTransitionTypes(Geofence.GEOFENCE_TRANSITION_ENTER | Geofence.GEOFENCE_TRANSITION_EXIT | Geofence.GEOFENCE_TRANSITION_DWELL);
    Geofence fence1 = builder.build();
    builder.setCircularRegion(41.910359, -87.651444, 100.0f)
        .setExpirationDuration(Geofence.NEVER_EXPIRE)
        .setRequestId("2")
        .setTransitionTypes(Geofence.GEOFENCE_TRANSITION_ENTER | Geofence.GEOFENCE_TRANSITION_EXIT);
    Geofence fence2 = builder.build();



    Intent intent = new Intent(this, ReceiveTransitionsBroadcastReceiver.class);
    PendingIntent pi = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

    locationClient.addGeofences(Arrays.asList(fence1,fence2), pi, this);
}

Спасибо, что проверили это, я ценю помощь.

РЕДАКТИРОВАТЬ: Радиус геозоны составляет 1000 метров. Я проезжаю около мили туда и обратно, но ничего, поэтому я предполагаю, что проблема не в точности. Обратите внимание, что устройство не активировано, поэтому я использую только Wi-Fi, но вокруг каждой геозоны есть десятки точек Wi-Fi, к которым я подключаюсь.


person Josh    schedule 30.05.2014    source источник
comment
Вы когда-нибудь заставляли это работать правильно?   -  person zen_1991    schedule 23.01.2017


Ответы (2)


Важное замечание по Google Play GeoFencing API. Я обнаружил, что GeoFencing никогда интеллектуально не извлекает местоположение из оборудования GPS. GeoFence API будет отслеживать наиболее точное местоположение, доступное из ОС, или, если последнее чтение местоположения недоступно, это приведет к расчету местоположения из Wi-Fi / Cellular. (что отстой, потому что сотовая связь неточная, а Wi-Fi часто недоступен)

Таким образом, чтобы получить отзывчивые или точные результаты из API Geofencing, вам необходимо настроить свои Geofences, а затем опросить оборудование GPS с некоторым интервалом, даже ничего не делая с полученным результатом, чтобы на поверхности были предоставлены полезные данные для ОС и Geofence API.

Это, вероятно, основная причина, по которой вы не видите никаких результатов. События геозоны не сработают, пока ОС не будет на 100 % уверена в действии. Таким образом, если показания местоположения имеют точность 500 метров (не исключено при использовании сотовой геолокации), а ваш забор имеет радиус 50 м, вы никогда не сможете создать событие входа, и вам нужно будет как минимум ~ 550 м от вашей точки забора, чтобы произвести событие выхода.

TLDR; Опрашивайте оборудование GPS с интервалом, ничего не делая с результатом, и вы начнете получать более точные геозоны.

person stealthwang    schedule 31.05.2014
comment
Каков наилучший способ опросить оборудование GPS без серьезного влияния на срок службы батареи? - person toobsco42; 07.04.2015
comment
опрашивать аппаратное обеспечение GPS с некоторым интервалом, даже ничего не делая с результатом... И тогда ваше приложение сжигает батарею, и пользователь недоумевает, почему его телефон греется, когда он им не пользуется... они смотрят в раздел батареи и видите, что ваше приложение является худшим преступником и указано в списке с самым высоким потреблением батареи ... а затем они дают вам 1-звездочный рейтинг и удаляют ваше приложение. Так что да, проблема решена... наверное. - person Greg Ennis; 24.05.2015
comment
мое приложение развертывается в среде, где точность имеет первостепенное значение, а энергопотребление незначительно, поскольку устройство подключено к сети. Так что да, моя проблема была решена. это не моя вина, что точность Android GPS невыносима, если вы не сделаете этого. вы должны развиваться для ваших собственных ограничений. увеличьте свой интервал и внедрите некоторую логику отсрочки в интервал времени, когда вы все еще находитесь на большом расстоянии от геозоны, если вы действительно привержены точности и времени автономной работы. - person stealthwang; 24.05.2015

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

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

Удачи с вашим проектом.

person guycole    schedule 05.06.2014