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

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

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

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

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

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

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

感谢和抱歉我的英语

【问题讨论】:

    标签: android geolocation android-location


    【解决方案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)。它会返回你真实的。对我来说,那是错误的。
    • 好吧,现在我找到了你,检查一下,加上上面的代码,你会得到你需要的 stackoverflow.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

    【讨论】:

      猜你喜欢
      • 2021-09-11
      • 2010-09-06
      • 1970-01-01
      • 1970-01-01
      • 2015-08-02
      • 2016-04-16
      • 1970-01-01
      • 2013-12-19
      • 1970-01-01
      相关资源
      最近更新 更多