【问题标题】:Android geofencing API BroadcastReceiver not triggered未触发 Android 地理围栏 API BroadcastReceiver
【发布时间】:2014-04-04 20:51:55
【问题描述】:

我正在尝试使用来自 google play 服务的地理围栏 api,但我无法让我的广播接收器触发其 onReceive() 方法。

看起来我尊重使它工作所需的一切,但我没有收到任何过渡事件。

  • 我在我的依赖项中包含了 google play 服务
  • 我请求ACCESS_FINE_LOCATION 权限
  • 我在我的 Manifest 中注册了我的 BroadcastReceiver,并将导出的值设置为“true”(有人说它是必需的)
  • 我在我所在的确切位置添加了一个大地理围栏(我使用手机上的 Google 地图对其进行了验证),其中包含过渡类型且没有过期
  • 我尝试在地理围栏中间设置一个精确的模拟位置,并在 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#]

如果没有人可以帮助我,我担心我会使用在 GPS_PROVIDER 中注册的 LocationManager 来实现我自己的地理围栏算法,这会耗尽用户的电池...

【问题讨论】:

  • 您在模拟 GPS 位置吗?我会说地理围栏的精度不可靠
  • 我也尝试过模拟位置。我使用了地理围栏中间的一个位置,精度很小。它和我使用我的真实位置时完全一样。
  • 只有当您走出地理围栏时才会触发该事件
  • 我在地理围栏内使用了一个模拟位置,然后 10 秒后非常远在外面,但仍然没有触发任何事件... :(
  • 嗯...今天每次我启动我的应用程序时它都在工作,我没有修改我的手机设置和我的应用程序代码...我不明白这个地理围栏 API -_-

标签: android broadcastreceiver google-play-services geofencing location-client


【解决方案1】:

首先,您确定您的坐标是正确的吗?我在玩地理围栏时遇到了一个非常相似的问题,我花了一段时间才意识到我的坐标只是倒置了。

不用说,我觉得自己很愚蠢。

【讨论】:

  • 是的,我刚刚意识到测试我的东西的人输入了倒置坐标。我绝对应该在我的代码中添加更多日志...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-01
  • 1970-01-01
  • 2015-11-07
  • 2019-03-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多