如何解决Android Geofencing API无法执行我的PendingIntent
我试图使用Android上的Google Geofencing API设置地理围栏。我创建了broadcastReceiver来处理过渡事件,并使用显式意图创建了待处理意图,该意图在创建地理围栏时传递给了API。但是,我的接收者的onReceive
从未被调用。我曾尝试使用setNotificationresponsiveness
和setinitialTrigger
的不同设置,但没有任何帮助。我已经在物理设备(带有Android 10的诺基亚7.1)和带有Android 10和6的两个模拟器上进行了尝试,但在这两个设备上均无法使用。我尝试等待几分钟以触发事件,但从未成功。我还尝试了不同的半径值,没有结果。
在Android 10上,我可以在系统进程日志中看到地理围栏确实已注册,但随后我只能看到一些有关位置可用性的条目,例如这样。即使isLocationAvailable
为真(并且我不知道该依赖什么),接收方仍然不会被触发:
I/GeofencerStateMachine: sendNewLocationAvailability: availability=LocationAvailability[isLocationAvailable: false]
这是一个不起作用的最小代码示例:
GeofenceReceiver.kt
class GeofenceReceiver : broadcastReceiver() {
companion object {
fun makePendingIntent(context: Context) = PendingIntent.getbroadcast(
context,1239,Intent(context,GeofenceReceiver::class.java),PendingIntent.FLAG_UPDATE_CURRENT
)
}
override fun onReceive(context: Context,intent: Intent) {
Log.e("geofencereceiver","received event")
// some code
}
}
AndroidManifest.xml(忽略了不相关的部分)
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.patlejch.geofenceminimal">
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
<application ...>
....
<receiver android:name=".GeofenceReceiver" />
<!-- note that setting the receiver as exported makes no difference (and it shouldn't) -->
</application>
</manifest>
注册地理围栏(this
是一项活动)。执行此代码后,该应用程序已被授予ACCESS_FINE_LOCATION
和ACCESS_BACKGROUND_LOCATION
:
// googleplex mountain view
val latitude = 37.421912
val longitude = -122.084068
val radius = 250.0f
val geofenceGms = Geofence.Builder()
.setRequestId("test_geofence")
.setCircularRegion(latitude,longitude,radius)
.setExpirationDuration(Geofence.NEVER_EXPIRE)
.setTransitionTypes(Geofence.GEOFENCE_TRANSITION_ENTER or Geofence.GEOFENCE_TRANSITION_EXIT)
//.setNotificationresponsiveness(...)
.build()
val request = GeofencingRequest.Builder()
//.setinitialTrigger(Geofence.GEOFENCE_TRANSITION_EXIT)
.addGeofence(geofenceGms)
.build()
val geofencingClient = LocationServices.getGeofencingClient(this)
try {
geofencingClient.addGeofences(request,GeofenceReceiver.makePendingIntent(this))
.addOnSuccessListener {
Toast.makeText(this,"registered",Toast.LENGTH_SHORT).show()
}
.addOnFailureListener {
Toast.makeText(this,"failure",Toast.LENGTH_SHORT).show()
}
} catch (e: SecurityException) {}
有人成功解决过类似的问题吗?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。