我遵循了本教程:https://developer.android.com/training/location/geofencing,并且在Android <8上运行良好,但是在Oreo中,由于新的操作系统背景限制,我遇到了问题。
当应用程序处于后台时,如何获取地理围栏转换触发器?
我还尝试使用BroadcastReceiver代替IntentService,但是结果是相同的。
待定意图:
private val geofencePendingIntent: PendingIntent by lazy {
val intent = Intent(context, GeofenceBroadcastReceiver::class.java)
intent.action = "com.example.GEOFENCE_TRANSITION"
PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)
}
注册地理围栏:
geofencingClient.addGeofences(request, geofencePendingIntent).run {
addOnSuccessListener {
Log.d(TAG, "Geofence added")
}
addOnFailureListener {
Log.e(TAG, "Failed to create geofence")
}
}
广播接收器:
class GeofenceBroadcastReceiver : BroadcastReceiver() {
override fun onReceive(p0: Context?, p1: Intent?) {
Log.d(TAG, "onReceive")
}
}
清单中的收件人
<receiver android:name=".GeofenceBroadcastReceiver">
<intent-filter>
<action android:name="com.example.GEOFENCE_TRANSITION"/>
</intent-filter>
</receiver>
谢谢
待定意图:
private val geofencePendingIntent: PendingIntent by lazy {
val intent = Intent(context, GeofenceIntentService::class.java)
PendingIntent.getService(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)
}
意向服务:
class GeofenceIntentService : IntentService("GeofenceIntentService") {
override fun onHandleIntent(p0: Intent?) {
Log.d(TAG, "onHandleIntent")
}
}
清单中的服务
<service android:name=".GeofenceIntentService"/>
答案 0 :(得分:1)
当在后台达到地理围栏转换时,您应该每两分钟在Android 8上获得一个Intent。
请参阅:https://developer.android.com/training/location/geofencing#java
处理地理围栏过渡 当定位服务检测到用户已进入或退出地理围栏时,它将发出包含在添加地理围栏请求中的PendingIntent中的Intent。该意图被诸如GeofenceTransitionsIntentService之类的服务接收,该服务从该意图中获取地理围栏事件,确定地理围栏转换的类型,并确定触发了哪个定义的地理围栏。然后发送通知作为输出。
注意:在Android 8.0(API级别26)及更高版本上,如果某个应用程序在监视地理围栏的同时在后台运行,则设备每两分钟响应一次地理围栏事件。要了解如何使您的应用适应这些响应限制,请参阅背景位置限制。
注册了地理围栏服务后,它仍然存在,您无需执行其他任何操作,只需检查IntentService中是否有特定的PendingIntent,不包括在重新启动设备后需要重新注册地理围栏服务。
还要检查:https://developer.android.com/about/versions/oreo/background-location-limits
答案 1 :(得分:0)
我将dexter库用于权限地理围栏,并且该功能适用于android 8 9 10及更高版本,您必须添加后台权限
Dexter.withActivity(this@Activity_Map)
.withPermissions(
Manifest.permission.ACCESS_COARSE_LOCATION
,Manifest.permission.ACCESS_FINE_LOCATION
,Manifest.permission.ACCESS_BACKGROUND_LOCATION
)
.withListener(object: MultiplePermissionsListener {
override fun onPermissionsChecked(report: MultiplePermissionsReport?) {
report?.let {
if(report.areAllPermissionsGranted()){
aktifkangps()
ambilshareddprefnip()
geofencingClient = LocationServices.getGeofencingClient(this@Activity_Map) //drawgeo()
cekInternet()
with(sharedPreferences) {
status = getString(loginmasuk.SP_NIP , "0").toString()
}
if (status == "failed"){
val imap = Intent(this@Activity_Map, Activity_ambil_lokasi::class.java)
startActivity(imap)
finish()
}
}