【问题标题】:Network Connection is closed but location provider is NetworkProvider网络连接已关闭,但位置提供者是 NetworkProvider
【发布时间】:2013-11-03 04:10:39
【问题描述】:

我尝试在 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 语句。但应该是假的。我该如何解决?

【问题讨论】:

    标签: android gps locationmanager android-location


    【解决方案1】:

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

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

    当你使用时

    locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)
    

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        我认为对你来说最好使用 googlePlay sdk 作为 GPS。

        它就像一个没有愚蠢错误的魅力。 我将您的代码更改为 googlePlay sdk,它非常适合我的用户。 (没有抱怨)

        【讨论】:

        • 您如何将代码更改为 googlePlay sdk。抱歉,我是 Android 新手
        【解决方案4】:

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

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

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 2020-05-12
            • 1970-01-01
            • 2013-12-19
            • 1970-01-01
            • 2013-11-01
            • 1970-01-01
            • 2012-02-17
            • 1970-01-01
            • 2017-05-24
            相关资源
            最近更新 更多