【发布时间】:2019-12-09 21:22:28
【问题描述】:
我想检测用户是否在运行时关闭了位置。我可以检查他是否打开了它,或者在应用程序启动之前用户是否关闭了该位置,但我无法检查他是否在之后将其关闭。
代码示例:
MapEntity 扩展 LocationListener
class MapViewer(a: MainActivity, parentView: ViewGroup) : MapEntity(a, parentView) {
override fun onProviderEnabled(provider: String?) {
activity.hideGpsSnackbar()
}
override fun onProviderDisabled(provider: String?) {
activity.showGpsSnackbar()
}
}
对于实时 GPS 位置检查,我使用的是GnssStatus.Callback()
更新:
我根据下面的答案创建了BroadcastReceiver。
abstract class GPSReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
try {
val locationManager = context.getSystemService(LOCATION_SERVICE) as LocationManager
if(locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
onGpsChanged(true)
} else {
onGpsChanged(false)
}
} catch (ex: Exception) {
App.log("IsGPSEnabled: $ex")
}
}
abstract fun onGpsChanged(isEnabled: Boolean)
}
我的一项活动中的代码:
private val gpsStatusReceiver = object : GPSReceiver() {
override fun onGpsChanged(isEnabled: Boolean) {
if (isEnabled){
hideGpsSnackbar()
} else {
showGpsSnackbar()
}
}
}
override fun onStart() {
super.onStart()
registerReceiver(gpsStatusReceiver, IntentFilter())
}
override fun onStop() {
super.onStop()
unregisterReceiver(gpsStatusReceiver)
}
更新
如果要支持 Android 6.0,则不能使用抽象类。因为它将尝试从 AndroidManifest 中定义的此类创建对象。 Android 8.0+ 不会检查 AndroidManifest 中的接收器,因此您可以从抽象类中实例化对象。因此,与其创建接口。
【问题讨论】:
标签: android kotlin android-location android-maps-v2 android-gps