如何在Oreo上的背景中监视地理围栏?

时间:2018-06-21 09:24:11

标签: android geolocation gps geofencing android-geofence

我遵循了本教程: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>

谢谢

编辑: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"/>

2 个答案:

答案 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()
                            }
                }