私はこのチュートリアルに従いました: https://developer.Android.com/training/location/geofencing そしてAndroid <8で正常に動作しますが、Oreoでは問題があります新しいOSバックグラウンドの制限による。
アプリがバックグラウンドにあるときにジオフェンス遷移トリガーを取得するにはどうすればよいですか?
IntentServiceの代わりにBroadcastReceiverを使用しようとしましたが、結果は同じです。
保留中の意図:
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"/>
ジオフェンスの移行にバックグラウンドで到達すると、Android 8で数分ごとにインテントを取得する必要があります。
参照: https://developer.Android.com/training/location/geofencing#Java
ジオフェンスの遷移を処理する位置情報サービスは、ユーザーがジオフェンスに出入りしたことを検出すると、ジオフェンスを追加するリクエストに含めたPendingIntentに含まれるインテントを送信します。このインテントは、GeofenceTransitionsIntentServiceなどのサービスによって受信されます。このサービスは、インテントからジオフェンシングイベントを取得し、ジオフェンス遷移のタイプを判別し、定義されたジオフェンスのどれがトリガーされたかを判別します。次に、出力として通知を送信します。
注:Android 8.0(APIレベル26)以降では、ジオフェンスの監視中にアプリがバックグラウンドで実行されている場合、デバイスは数分ごとにジオフェンシングイベントに応答します。方法についてはアプリをこれらの応答制限に適合させるには、「バックグラウンドロケーション制限」を参照してください。
ジオフェンスサービスが登録されると、それはまだそこにあり、他に何もすることはなく、特定のPendingIntentについてIntentServiceをチェックするだけです。デバイスが再起動されたときに除外すると、ジオフェンスサービスを再登録する必要があります。
また、チェックしてください: https://developer.Android.com/about/versions/oreo/background-location-limits