1

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

4

5 回答 5

6

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

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

当你使用

locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)

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

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

于 2014-03-03T18:30:31.993 回答
1

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

于 2013-10-24T15:03:42.697 回答
0

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

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

于 2013-10-24T12:47:49.460 回答
0

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

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

我发现使用 GooglePlayServices 获取位置更容易,然后在播放服务不可用或返回错误时切换到标准位置管理器作为备份。您可以在此处查看如何执行此操作。在 android 开发者博客上也有一篇很棒的文章,演示了如何结合这两种方法来使用 google play(如果可用),如果不可用则切换到常规位置管理器

于 2013-10-24T12:48:20.847 回答
0

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

于 2013-10-24T15:32:24.340 回答