网络连接已关闭,但位置提供程序是NetworkProvider

时间:2013-10-24 12:37:17

标签: android gps locationmanager android-location

我尝试在Android设备上获取用户的位置。程序检查GPS可用性。如果禁用GPSProvider,则会警告用户。如果用户未启用GPS,请检查networkProvider。

检查网络提供商的代码,

public boolean askNetworkProvider(){

    if(!locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)){
        AlertDialog builder = new AlertDialog.Builder(context)
                .setMessage("Enable Network Connection")
                .setTitle("Warning!")
                .setCancelable(true)
                .setPositiveButton("OK", new OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        return;
                    }
                } ).show();
    }

    if(locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)){

         locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 2000, 0, networkListener);
         mlocation = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
         Log.i(LocationService.class.getName(),"Network Enable!!");
         return true;

     }
    return false;
}

即使禁用了wifi和移动连接,它也表示networkProvider已启用并输入第二个if语句。但它应该是假的。我该如何解决?

5 个答案:

答案 0 :(得分:6)

可能您在下拉选项中禁用了主菜单的Wi-Fi连接,而不是禁用“设置 - 位置服务”下的“使用无线网络”。

请记住Wi-Fi!=使用无线网络。

使用时

locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)

它正在检查“用户无线网络”选项。

我遇到了同样的问题,在StackOverflow上发布了许多类似的问题,只有一个答案有这个信息。花了我整整一个下午。希望你明白了! :)

答案 1 :(得分:1)

在新的Android 4.3(API级别18及以上版本)和使用它的设备中,有一个高级WiFi设置:“扫描始终可用”。如果选中其复选框,则设备可以扫描WLAN&即使WiFi已关闭,因此很可能会输入第二个if语句。  要以编程方式修复此问题,可以将构建版本检查(可能还有一些其他设置检查)添加到if语句中。 (你应该定义在这种情况下你希望它如何工作。)  简单的手动解决方法当然是禁用设置:例如在Nexus 7中:设置 - > WiFi->高级 - >取消选中“始终可用扫描”。

答案 2 :(得分:0)

我认为最好使用googlePlay sdk作为GPS。

它的工作就像一个带有愚蠢错误的魅力。 我将您的代码更改为googlePlay sdk,这对我的用户来说非常完美。 (没有抱怨)

答案 3 :(得分:0)

我不认为“启用”意味着你的想法。您正在检查的是查看用户是否允许电话使用位置提供商,即启用位置服务以通过wifi获取位置。这并不意味着NetworkProvider已经或将会成功返回结果,只是用户允许访问它。

难点在于使用LocationManager没有“更新失败”的响应。只有当用户的位置在您的参数范围内发生变化时,才会通知您。如果它永远不会,那么你无能为力。

我发现使用GooglePlayServices更容易获取位置,然后在播放服务不可用或返回错误时切换到标准位置管理器作为备份。您可以看到如何执行此操作here。还有一个很棒的post on the android developers blog,它演示了如何将两种方法结合使用谷歌播放(如果可用)并切换到常规位置管理器(如果不可用)

答案 4 :(得分:0)

Google使用融合位置实施更新了其位置逻辑。我想你会发现这个样本很有趣。获取位置更新时,您不必定义启用哪个提供程序。 http://www.kpbird.com/2013/06/fused-location-provider-example.html?m=1
编辑:这不是你问题的答案,但在我看来,融合位置实现是位置监听的最佳实践。我希望你在融合的位置实现你的位置监听结构。