API геозон для Android BroadcastReceiver не запущен

Я пытаюсь использовать API геозоны из сервисов Google Play, но мне не удается заставить мой широковещательный приемник вызвать его onReceive() метод.

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

  • Я включаю сервисы Google Play в мои зависимости
  • Я прошу ACCESS_FINE_LOCATION разрешение
  • Я регистрирую свой BroadcastReceiver с экспортированным значением, установленным на "истина" (некоторые говорят, что это необходимо) в моем манифесте
  • Я добавляю большую геозону точно в то место, где я нахожусь (я проверил ее с помощью Google Maps на моем мобильном телефоне) с обоими типами перехода и без срока действия
  • Я попытался с точным макетным местоположением в середине геозоны, а другой - через 10 секунд (и я убедился, что ACCESS_MOCK_LOCATION персмиссия присутствовала)
  • Я проверил, что местоположение моего мобильного телефона было включено, и его режим был установлен с высокой точностью
  • Я проверил интернет соединение
  • Я пытался с и без отключения LocationClient после добавления геозоны

Но все же я получаю успешный onAddGeofencesResult() обратный звонок, но нет onReceive() Перезвоните. Я попробовал это с Nexus 5 и Nexus 7, и оба не в состоянии вызвать переходы геозоны.

Я также попробовал образец на https://developer.android.com/training/location/geofencing.html, но его поведение было идентичным.

Вот мой BroadcastReceiver учебный класс:

public class GeofencesReceiver extends BroadcastReceiver implements ConnectionCallbacks, OnConnectionFailedListener, OnAddGeofencesResultListener {
    private final static String TAG = "GeofencesReceiver";

    private Context context = null;
    private LocationClient locationClient = null;

    /**
     * An empty constructor is needed by the manifest.
     */
    @SuppressWarnings("unused")
    public GeofencesReceiver(){}

    public GeofencesReceiver(Context context){
        this.context = context;
        locationClient = new LocationClient(context, this, this);
        locationClient.connect();
    }

    @Override
    public void onConnected(Bundle bundle) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                List<Geofence> geofences = getGeofences();
                if(geofences.size() > 0){
                    Intent geofenceBroadcastReceiverIntent = new Intent(context, GeofencesReceiver.class);
                    PendingIntent pi = PendingIntent.getBroadcast(context, 0, geofenceBroadcastReceiverIntent, PendingIntent.FLAG_UPDATE_CURRENT);
                    locationClient.addGeofences(geofences, pi, GeofencesReceiver.this);
                }else
                    Log.w(TAG, "No GPS zone found");
            }
        }).start();
    }

    private List<Geofence> getGeofences(){
        Vector<Geofence> geofences = new Vector<Geofence>();
        Geofence geofence = new Geofence.Builder()
                    .setRequestId("1")
                    .setTransitionTypes(Geofence.GEOFENCE_TRANSITION_ENTER | Geofence.GEOFENCE_TRANSITION_EXIT)
                    .setCircularRegion(45.2676018, -72.1572185, 100)
                    .setExpirationDuration(Geofence.NEVER_EXPIRE)
                    .build();
        geofences.add(geofence);
        return geofences;
    }

    @Override
    public void onDisconnected() {
        Log.d(TAG, "onDisconnected");
    }

    @Override
    public void onAddGeofencesResult(int i, String[] strings) {
        if(i != LocationStatusCodes.SUCCESS)
            Log.e(TAG, "Failed to add geofences");
        else
            Log.d(TAG, "Geofences successfully added");
        locationClient.disconnect();
    }

    @Override
    public void onConnectionFailed(ConnectionResult connectionResult) {
        Log.e(TAG, "onConnectionFailed");
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d(TAG, "onReceive");
        if(LocationClient.hasError(intent)){
            int errorCode = LocationClient.getErrorCode(intent);
            Log.e(TAG, "Location Services error: " + Integer.toString(errorCode));
            return;
        }
        int transitionType = LocationClient.getGeofenceTransition(intent);
        if(transitionType == Geofence.GEOFENCE_TRANSITION_ENTER || transitionType == Geofence.GEOFENCE_TRANSITION_EXIT) {
            List<Geofence> triggerList = LocationClient.getTriggeringGeofences(intent);
            for(Geofence geofence : triggerList){
                Log.d(TAG, (transitionType == Geofence.GEOFENCE_TRANSITION_ENTER ? "Entering" : "Exiting") + " GPS zone " + geofence.getRequestId());
            }
        }else{
            Log.e(TAG, "Geofence transition error: " + transitionType);
        }
    }
}

В моем Манифесте у меня есть следующие строки (не в этой структуре)

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<receiver android:name="novom.anyware.anywaresdk.GeofencesReceiver" android:exported="true" />
<meta-data android:name="com.google.android.gms.version" android:value="4323000" />

И в моем файле build.gradle я включаю такие сервисы

dependencies {
    compile 'com.google.android.gms:play-services:4.3.23'
}

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

04-07 09:01:14.631    1160-1319/? I/GCoreUlr﹕ Successfully inserted location
04-07 09:01:14.631    1160-1319/? I/GCoreUlr﹕ Not calling LocationReportingService, hasMoved: true, elapsed millis: 580166, request: Phone

04-07 09:02:16.481    1160-1319/? I/GCoreUlr﹕ Successfully inserted location
04-07 09:02:16.501    1160-1319/? I/GCoreUlr﹕ Starting service, intent=Intent { cmp=com.google.android.gms/com.google.android.location.reporting.LocationReportingService }, extras=null
04-07 09:02:16.571    1210-1252/? W/GLSUser﹕ GoogleAccountDataService.getToken()
04-07 09:02:16.601    1160-3780/? I/qtaguid﹕ Failed write_ctrl(u 69) res=-1 errno=22
04-07 09:02:16.601    1160-3780/? I/qtaguid﹕ Untagging socket 69 failed errno=-22
04-07 09:02:16.601    1160-3780/? W/NetworkManagementSocketTagger﹕ untagSocket(69) failed with errno -22
04-07 09:02:16.601    1160-3780/? I/imp﹕ I/O exception (org.apache.http.NoHttpResponseException) caught when processing request: The target server failed to respond
04-07 09:02:16.601    1160-3780/? I/imp﹕ Retrying request
04-07 09:02:17.501    1160-6156/? I/GCoreUlr﹕ Starting service, intent=Intent { act=com.google.android.location.reporting.ACTION_UPDATE_ACTIVE_STATE cmp=com.google.android.gms/com.google.android.location.reporting.service.DispatchingService }, extras=null
04-07 09:02:17.511    1160-6156/? I/GCoreUlr﹕ Batch Location Update succeeded for account account#7#
04-07 09:02:17.571    1160-1319/? I/GCoreUlr﹕ Ensuring that reporting is active for [account#7#]

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

1 ответ

Решение

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

Излишне говорить, что я чувствовал себя глупо.

Другие вопросы по тегам