检查位置提供者状态

Posted

技术标签:

【中文标题】检查位置提供者状态【英文标题】:Check Location Provider Status 【发布时间】:2014-06-23 04:16:11 【问题描述】:

我正在制作一个测试项目来学习如何在 android 中使用 Location。

我想使用 WIFI/3G 作为默认提供程序,但如果没有工作(例如,飞行模式设置为 ON),我想切换到 GPS。

我的想法是检查 NETWORK_PROVIDER 状态。如果不可用,请检查 GPS_PROVIDER 状态。如果这也不可用,请不要使用位置并显示消息。

为此,我需要检查当前的提供者状态,但我找不到方法。 有什么办法吗?

我曾尝试使用 isProviderEnabled,但该方法仅告诉我 Provider 是否可以使用,但如果真的启用则不会。

理想的想法是在调用 requestLocationUpdates 之前这样做

感谢和抱歉我的英语

【问题讨论】:

【参考方案1】:

使用此代码检查

 LocationManager mlocMan = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
if(!mlocMan .isProviderEnabled(LocationManager.GPS_PROVIDER) && !mlocMan .isProviderEnabled(LocationManager.NETWORK_PROVIDER))

//both providers are disabled, show a message...

编辑:

//--------------------------------------------------------
private static boolean isAirplaneModeOn(Context context) 

   return Settings.System.getInt(context.getContentResolver(),
           Settings.System.AIRPLANE_MODE_ON, 0) != 0;



public void onCreate()
// .. some code

LocationManager mlocMan = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

if(!isAirplaneModeOn(this))//airplan is OFF, check Providers

if(mlocMan.isProviderEnabled(LocationManager.NETWORK_PROVIDER)
//start listener to requestUpdates ...
else
//NETWORK_PROVIDER disabled, try GPS
if(mlocMan .isProviderEnabled(LocationManager.GPS_PROVIDER))
//start listener to requestUpdates ...
else
//show message, no providers enabled.


//network disabled

else//airplan mode is ON
//here you need to check GPS only, as netwrok is OFF for sure
if(mlocMan .isProviderEnabled(LocationManager.GPS_PROVIDER))
//start listener to requestUpdates ...
else
//show message, no providers enabled.


//airplan is ON

//onCreate()

可能有一些语法错误,但我认为这个逻辑是你需要的。

【讨论】:

那不是我想要的。 isProviderEnabled 仅告诉您用户是否允许您使用 GPS_PROVIDER 或 NETWORK_PROVIDER。它不会告诉你 GPS 是打开还是关闭,或者手机是否处于飞行模式 我看不出这不是你想要的!我的想法是检查 NETWORK_PROVIDER 状态。如果不可用,请检查 GPS_PROVIDER 状态。如果这也不可用,请不要使用位置并显示消息。这就是我给你的。 告诉你用户是否让你使用 GPS_PROVIDER,taht 表示它的 ENABLED。 试试这个,把手机调成飞行模式,然后调用locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)。它会返回你真实的。对我来说,那是错误的。 好吧,现在我找到了你,检查一下,加上上面的代码,你会得到你需要的 ***.com/questions/4319212/…【参考方案2】:

我正准备在我的一个应用程序中进行设置,但我还没有尝试过。如果您使用对 LocationManager::requestLocationUpdates() 的调用注册 LocationListener,则框架应调用 LocationListener 的 onStatusChanged(String provider, int status, Bundle extras) 并提供状态。状态应该是 AVAILABLE、OUT_OF_SERVICE 或 TEMPORARILY_UNAVAILABLE。

理论上,当用户切换到飞行模式时,您应该会收到状态为 OUT_OF_SERVICE 或 TEMPORARILY_UNAVAILABLE 的 onStatusChanged 调用。然后,您可以切换到使用其他提供商。关闭飞行模式后,您应该会再次收到状态为 AVAILABLE 的呼叫,并且您可以恢复使用之前的提供商。

位置监听器参考: https://developer.android.com/reference/android/location/LocationListener

【讨论】:

以上是关于检查位置提供者状态的主要内容,如果未能解决你的问题,请参考以下文章

位置为空融合位置提供者android

Navigator.pushReplacement 提供用于空值的空检查运算符。这次是 - 状态

Checkpointing

如何查看 WIFI 或 GPS 提供的用户位置

使用paypal检查付款状态,该付款方式仅包含用户在secont时刻提供的付款信息

Kotlin - 从网络提供商获取位置的问题