我需要澄清Geofence指南提供的示例代码,如下所示:
https://developer.android.com/training/location/geofencing.html
我运行了代码并且我看到地理围栏是正确创建的,但我真正想要的是一种在我开车到那些地理围栏位置时收到警报的方法。现在,当我经过那些地理围栏点时,没有任何事情发生(ReceiveTransitionsIntentService不会被调用),没有任何通知。
我是否还必须定期听取位置更新并手动将lat / lng传递给上面的代码以指示我当前的位置?我认为当我将地理位置添加到LocationClient时,这应该是自动的,但我想还有更多。
我还尝试将LocationRequest注册到LocationClient实例,但仍然没有警报:
mLocationRequest = LocationRequest.create();
mLocationRequest.setInterval(LocationUtils.UPDATE_INTERVAL_IN_MILLISECONDS);
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
mLocationRequest.setFastestInterval(LocationUtils.FAST_INTERVAL_CEILING_IN_MILLISECONDS);
mLocationClient.requestLocationUpdates(mLocationRequest, (LocationListener)mActivity);
如何将Geofence api与位置跟踪集成?
答案 0 :(得分:4)
我也有问题。将服务添加到AndroidManifest时,请确保正确定义了路径。我还必须将导出值更改为true。
<application>
...
<service
android:name=".ReceiveTransitionsIntentService"
android:exported="true" >
</service>
...
</application>
您还需要在Manifest中添加元数据标记,以指定您的Google gms版本。
<application>
...
<meta-data
android:name="com.google.android.gms.version"
android:value="4242000" />
...
</application>
我创建了一个更简单的Google示例版本,其中包含代码和更多解释here。希望有所帮助!
答案 1 :(得分:3)
不幸的是,这似乎是预期的行为。 Geofence API设置为侦听设备上的自动位置更新。这通常适用于您在某个地方定居,但正如您所说,如果您驾车穿过围栏或者您的半径只有几米,您很可能会错过它。据说API会自动检查您的行为(步行,驾驶等)并更频繁地更新,但似乎并非如此。
如果您打开谷歌地图并跟踪您的位置,您会注意到,这些围栏将被正确触发。
因此,您可以假设唯一真正的解决方案是设置您自己的服务,该服务按照定义的时间间隔轮询位置(Google建议20秒https://www.youtube.com/watch?v=Bte_GHuxUGc),这将强制以这些间隔广播位置。如果地理围栏位于此位置,则会自动触发地理围栏。
答案 2 :(得分:1)
一些快速说明:确保选择了正确的过渡。您可能想要设置入口和出口过渡。
Geofencing的代码段不显示通知。这是故意的;通知并不总是对转换的最佳响应。示例应用程序显示通知,如果您下载示例,则可以看到此消息。
位置服务会尽力确定您的位置。
另请记住,您必须请求ACCESS_FINE_LOCATION。
在后台“流程”中,您不会找到有关地理围栏跟踪(或与位置相关的任何其他内容)的任何具体信息。所有这些都在Google Play服务中。
答案 3 :(得分:1)
@andrewmolo 我尝试时遇到同样的问题。 您应该为项目设置正确的构建路径和库。当我设置如下时,它对我有用。
确保你有
1. android-support-v4.jar
2. Google APIs
3. google-play-services_lib.jar
4. google-play-services.jar
同样在订购和导出时,您应该在底部位置安装Google API,并选择所有其他API。
答案 4 :(得分:1)
我也对示例代码有些麻烦。这对我有用。
latitude = sharedPreferences.getFloat("storeAddress_lat", -1);
longitude = sharedPreferences.getFloat("storeAddress_lng", -1);
final ArrayList<Geofence> list = new ArrayList<Geofence>();
Builder builder = new Geofence.Builder();
builder.setRequestId("near_store_geofence");
builder.setCircularRegion(latitude, longitude, 50);
builder.setTransitionTypes(Geofence.GEOFENCE_TRANSITION_ENTER);
builder.setExpirationDuration(Geofence.NEVER_EXPIRE);
list.add(builder.build());
builder = new Geofence.Builder();
builder.setRequestId("leave_store_geofence");
builder.setCircularRegion(latitude, longitude, 50);
builder.setTransitionTypes(Geofence.GEOFENCE_TRANSITION_EXIT);
builder.setExpirationDuration(Geofence.NEVER_EXPIRE);
list.add(builder.build());
final GooglePlayServicesClient.ConnectionCallbacks connectionCallbacks = new GooglePlayServicesClient.ConnectionCallbacks(){
@Override
public void onConnected(Bundle connectionHint) {
Log.i("GEOFENCE","onConnected");
// Create an explicit Intent
Intent intent = new Intent(getBaseContext(), ReceiveTransitionsIntentService.class);
/*
* Return the PendingIntent
*/
PendingIntent pendingIntent = PendingIntent.getService(
getBaseContext(),
0,
intent,
PendingIntent.FLAG_UPDATE_CURRENT);
locationClient.addGeofences(list,pendingIntent, new OnAddGeofencesResultListener(){public void onAddGeofencesResult(int statusCode, String[] geofenceRequestIds) {
Log.i("GEOFENCE","onAddGeofencesResult");
}});
LocationRequest locationrequest = LocationRequest.create();
locationrequest.setPriority(locationrequest.PRIORITY_HIGH_ACCURACY);
locationrequest.setInterval(5000);
locationClient.requestLocationUpdates(locationrequest, new LocationListener(){
@Override
public void onLocationChanged(Location location) {
// TODO Auto-generated method stub
}});
}
@Override
public void onDisconnected() {
Log.i("GEOFENCE","onDisconnected");
}
};
GooglePlayServicesClient.OnConnectionFailedListener onConnectionFailedListener = new GooglePlayServicesClient.OnConnectionFailedListener(){
@Override
public void onConnectionFailed(ConnectionResult result) {
Log.i("GEOFENCE","onConnectionFailed");
}
};
locationClient = new LocationClient(getBaseContext(), connectionCallbacks, onConnectionFailedListener);
locationClient.connect();
答案 5 :(得分:1)
GPS从未通过地理围栏API启用(这很糟糕,我需要响应地理位置,并且不关心耗电量)。文档中的任何地方都没有提到这一点。此外,如果没有GPS,由于wifi /小区缺乏准确性,您可能希望拥有较小的地理围栏。
您必须使用空处理程序单独轮询GPS,以便为该空处理程序提供的有价值位置也会提供给地理围栏API,从而可靠地触发您的地理围栏。
答案 6 :(得分:0)
请注意,该示例包含的错误会使您的围栏在12分钟后过期而不是预期的12小时...... 修复变更
private static final long SECONDS_PER_HOUR = 60;
到
private static final long SECONDS_PER_HOUR = 60*60;
MainActivity中的