我有一个以Google的地理围栏示例代码开头的应用.它可以工作几天,我得到了所有过渡意图,正如我预期的那样.然而,经过一段时间,比如3天,应用程序停止了这些意图,我不知道为什么.
当我创建我的围栏时,我将到期时间设置为Geofence.NEVER_EXPIRE
这是我的IntentService,我在它停止工作之前获得转换意图:
public class ReceiveTransitionsIntentService extends IntentService {
@Override
protected void onHandleIntent(Intent intent) {
Intent broadcastIntent = new Intent();
broadcastIntent.addCategory(GeofenceUtils.CATEGORY_LOCATION_SERVICES);
// First check for errors
if (LocationClient.hasError(intent)) {
...handle errors
} else {
// Get the type of transition (entry or exit)
int transition = LocationClient.getGeofenceTransition(intent);
// Test that a valid transition was reported
if ((transition == Geofence.GEOFENCE_TRANSITION_ENTER)
|| (transition == Geofence.GEOFENCE_TRANSITION_EXIT)) {
// Post a notification
NEVER GETS HERE
} else {
...log error
}
}
}
} …Run Code Online (Sandbox Code Playgroud) 我正在使用内置的地理围栏API(播放服务),并且结果好坏参半.看起来在设置地理围栏之后,即使GPS打开,进入/退出的通知也非常不一致,具有最新位置(连接了LocationClient,在后台运行.)我开始监控(轮询)位置变化和调试文本字段中的距离,并且即使基于设备注册的位置和地理围栏的位置(我在技术上是在地理围栏的内部/外部),通常有时会触发通知,有时也不会.有什么方法可以让它更具可预测性?我几乎想要放弃这个api并根据设备位置的轮询实现我自己的(电池耗尽)地理围栏.
系统是持久存在还是我必须在重启后再次添加它们?我在https://developer.android.com/training/location/geofencing.html的文档中没有找到任何相关信息.
我正在使用以下代码来获取位置开/关事件.
<receiver
android:name=".receivers.GpsReceiver"
android:enabled="true">
<intent-filter>
<action android:name="android.location.PROVIDERS_CHANGED" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)
我正在开发基于地理围栏的应用程序.基于仅在需要时重新注册地理围栏,我们必须在应用程序收到GEOFENCE_NOT_AVAILABLE警报后重新注册地理围栏.这通常发生在禁用NLP(Android的网络位置提供程序)之后.
通过使用此广播接收器,我在启用Android的网络位置提供程序时重新注册了地理围栏.
但是从API级别26开始,这个广播接收器永远不会工作.请参阅 后台执行限制.
那么如何在API 26及更高版本中实现相同的任务呢?
注意:即使app在后台,我也需要重新注册地理围栏.
我即将实现地理围栏的功能,在我完成任何认真的工作之前,我需要知道在第一次转换后地理围栏是否仍然有效.
该功能的核心是:
每次我在点P的x米范围内(称之为区域A),我都希望动作B出现.
我需要知道的是
Geofence.NEVER_EXPIRE并确保每次进入指定区域时都会获得PendingIntent,无论是否经过时间,重新启动等等要么
我希望前者是这样的
android geofencing google-play-services android-geofence location-client
根据Android地理围栏文档,如果发生以下情况,应重新注册地理围栏:
解决方案:添加地理围栏时,应用程序应在内部存储地理围栏(SharedPreferences)。然后侦听设备的启动完成操作,然后重新注册存储的地理围栏。
解决方案:用户应再次创建地理围栏或将其远程存储,然后在应用程序首次打开时进行检索。
解决方案:用户应再次创建地理围栏或将其远程存储,然后在应用程序首次打开时进行检索。
但是,在以下情况下,我不知道该怎么办,请您指教?
Google Play服务数据已清除。我如何发现这种情况?
该应用程序已收到GEOFENCE_NOT_AVAILABLE警报。通常会在禁用NLP(Android的网络位置提供程序)后发生。不确定在哪里收到此“警报”
这只发生在Android Oreo上.我正在使用Play Services 11.4.2.我正在使用GeofencingClient注册地理围栏,并将带有pendingIntent的addGeofences方法注册到处理地理围栏过渡的IntentService.看起来播放服务发送的意图在某些条件下被操作系统阻止.
系统记录以下内容:
Background start not allowed: service Intent { cmp=my.app.id/my.package.struct.GeofenceTransIntentService (has extras) } to my.app.id/my.package.struct.GeofenceTransIntentService from pid=-1 uid=10154 pkg=my.app.id
Run Code Online (Sandbox Code Playgroud)
一旦我在以下情况下添加地理围栏:
android google-play-services android-geofence google-location-services