我正在编写一个应用程序,当有人在正在安装的应用程序的生命周期内进入/退出多个站点时,需要使用地理围栏.
我的地理围栏实现(非常类似于下面的第二个链接)在我第一次安装应用程序时工作正常,无论是在移入/移出地理围栏时还是在使用模拟位置进行模拟时,都会重新启动设备.
在重新启动时,模拟位置或实际上物理移入和移出地理围栏似乎都会触发事件并将未决意图发送到我的广播接收器.
我已经查看了以下三个链接,并且还阅读了相当多的文档,但我无法找到一个明确的答案,直接说注册地理围栏持续存在或重启后不会持续存在.
这些是我在堆栈溢出时查看的链接: Android地理围栏是否能够在重启时幸存?
Android Geofences是否在删除/过期之前保持活动状态,或者直到我的PendingIntent启动为止
如果有人碰巧知道他们是否坚持重新启动后的答案,或者如果他们没有解决问题,那将非常感谢!我目前的最后一个希望是为BOOT_COMPLETED创建一个监听器,并在启动时重新注册它们,但id更喜欢只在必要时才这样做.
非常感谢提前!
编辑:虽然我没有找到明确的(书面)答案,但我很确定TonyC先生发布的内容是正确的,并选择了解决方案.非常感谢TonyC!
如果有人想看到我的解决方案,我会在设备启动时监听启动完成操作,然后重新注册我需要的所有地理围栏.
这是显而易见的:
<!-- Listen for the device starting up -->
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<receiver android:name="com.YOUR.PACKAGE.geofence.BootCompleteReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)
然后为它创建一个广播接收器,它将在启动时重新注册地理围栏:
package com.YOUR.PACKAGE.geofence;
import android.app.PendingIntent.CanceledException;
import android.content.Context;
import android.content.Intent;
import android.support.v4.content.WakefulBroadcastReceiver;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesUtil;
import com.google.android.gms.location.Geofence;
public class BootCompleteReceiver extends WakefulBroadcastReceiver
{
private static final String TAG = "BootCompleteReceiver";
@Override
public void onReceive(Context context, Intent intent)
{
//Do what you want/Register Geofences
}
}
Run Code Online (Sandbox Code Playgroud)
同样值得注意的是,如果您在启动时处于地理围栏内,那么一旦注册了地理围栏,这通常会触发地理围栏的未决意图.
因此,例如,如果地理围栏启动应用程序,那么当您启动恰好位于地理围栏中的设备时,一旦启动完整广播接收器已注册地理围栏,它也将打开应用程序,并且位置服务已经解决了您的位置是.
希望对某人有所帮助.
android geofencing google-play-services android-geofence location-client
根据Android地理围栏文档,如果发生以下情况,应重新注册地理围栏:
解决方案:添加地理围栏时,应用程序应在内部存储地理围栏(SharedPreferences)。然后侦听设备的启动完成操作,然后重新注册存储的地理围栏。
解决方案:用户应再次创建地理围栏或将其远程存储,然后在应用程序首次打开时进行检索。
解决方案:用户应再次创建地理围栏或将其远程存储,然后在应用程序首次打开时进行检索。
但是,在以下情况下,我不知道该怎么办,请您指教?
Google Play服务数据已清除。我如何发现这种情况?
该应用程序已收到GEOFENCE_NOT_AVAILABLE警报。通常会在禁用NLP(Android的网络位置提供程序)后发生。不确定在哪里收到此“警报”
我想检测用户是否在运行时关闭了该位置。我可以检查他是否打开了它,或者在应用程序启动之前用户是否关闭了位置,但我无法检查他是否在之后关闭了它。
代码示例:
MapEntity扩展LocationListener
class MapViewer(a: MainActivity, parentView: ViewGroup) : MapEntity(a, parentView) {
override fun onProviderEnabled(provider: String?) {
activity.hideGpsSnackbar()
}
override fun onProviderDisabled(provider: String?) {
activity.showGpsSnackbar()
}
}
Run Code Online (Sandbox Code Playgroud)
对于实时 GPS 位置检查,我正在使用 GnssStatus.Callback()
更新:
我已经BroadcastReceiver根据下面的答案创建了。
abstract class GPSReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
try {
val locationManager = context.getSystemService(LOCATION_SERVICE) as LocationManager
if(locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
onGpsChanged(true)
} else {
onGpsChanged(false)
}
} catch (ex: Exception) {
App.log("IsGPSEnabled: $ex")
}
}
abstract fun onGpsChanged(isEnabled: Boolean)
} …Run Code Online (Sandbox Code Playgroud) 我正在使用 Android 地理围栏 API。添加地理围栏后,当位置打开时,它工作正常。但是如果我关闭位置并再次打开,之后进入或退出时地理围栏不会触发。我已经在使用 Android 5.0.2 设备的 Moto G 上进行了测试。如果位置关闭,地理围栏是否会过期?
我在 Android 文档中看到,
如果用户禁用网络位置提供程序,地理围栏服务将停止更新,所有注册的地理围栏将被删除,并由提供的待处理意图生成意图。在这种情况下,从此意图创建的 GeofencingEvent 表示错误事件,其中 hasError() 返回 true,而 getErrorCode() 返回 GEOFENCE_NOT_AVAILABLE。