如何在奥利奥后台监控地理围栏?

Posted

技术标签:

【中文标题】如何在奥利奥后台监控地理围栏?【英文标题】:How to monitor geofences in background on Oreo? 【发布时间】:2018-11-30 13:50:47 【问题描述】:

我遵循本教程:https://developer.android.com/training/location/geofencing 并且在 Android

当应用在后台时,如何获取地理围栏转换触发器?

我也试过用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>

谢谢

编辑:IntentService 版本

待定意图:

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"/>

【问题讨论】:

你可以在你使用 IntentService 时发布代码吗? 是的,我编辑了问题 阅读这些链接 ***.com/questions/45422591/… ***.com/questions/37565321/… 【参考方案1】:

在 Android 8 上,当您在后台达到地理围栏转换时,您应该每隔几分钟获得一个 Intent。

见:https://developer.android.com/training/location/geofencing#java

处理地理围栏转换 当定位服务检测到用户已进入或退出地理围栏时,它会发送您在添加地理围栏的请求中包含的 PendingIntent 中包含的 Intent。此 Intent 由诸如 GeofenceTransitionsIntentService 之类的服务接收,该服务从 Intent 中获取地理围栏事件,确定地理围栏转换的类型,并确定触发了哪些已定义的地理围栏。然后它发送一个通知作为输出。

注意:在 Android 8.0(API 级别 26)及更高版本中,如果应用在监控地理围栏时在后台运行,则设备每隔几分钟就会响应一次地理围栏事件。要了解如何使您的应用适应这些响应限制,请参阅后台位置限制。

注册地理围栏服务后,它仍然存在,您无事可做,只需检查您的 IntentService 是否有特定的 PendingIntent,排除设备重启时需要重新注册您的地理围栏服务。

同时检查:https://developer.android.com/about/versions/oreo/background-location-limits

【讨论】:

请记住,有几种情况需要重新注册地理围栏。请参阅my answer to a related question 了解更多信息。【参考方案2】:

我使用 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())
                  //put your code here
                            
                

【讨论】:

即使添加了权限,应用也可以在没有前台定位服务的情况下读取位置,就像打开谷歌地图应用一样。

以上是关于如何在奥利奥后台监控地理围栏?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Geofence android 中添加后台服务

奥利奥和派的后台服务问题

如何提高 Android 地理围栏进入/退出通知的一致性?

如何在 Android 中创建地理围栏?

应用程序在后台时未触发地理围栏通知

在后台应用程序时不会触发地理围栏通知