LocationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER)始终在Galaxy S7上返回NULL(仅限)

时间:2016-03-15 17:59:41

标签: android samsung-mobile

刚刚收到运行Marshmallow(6.0.1)的Galaxy S7(Edge)并发现我的应用程序使用android.permission.ACCESS_COARSE_LOCATION并且攻击Sdk版本22(Lollipop)时出现问题。当我调用locationManager.getLastKnownLocation()时,它总是返回NULL。这就是我正在运行的:

public Location getLastKnownLocationObject(Context context) {

    LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);

    try {
        if (locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
            Location location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
            // Location is always null on S7 (only)
            Log.i(TAG, ">>> getLastKnownLocationObject() getLastKnownLocation: " + location);
            return location;
        }

    } catch (Exception e) {
        Log.e(TAG, ">>> getLastKnownLocationObject() exception", e);
    }
    return null;

}

这个代码在我尝试的其他所有设备上都能正常工作:Galaxy S5(5.0.1),Nexus 7(5.0.1),Nexus 9(6.0.1)和Samsung Tab3(4.4.2)< / p>

请注意,如果我将清单更改为使用ACCESS_FINE_LOCATION,则上述代码在每台设备上都能正常运行。不幸的是,管理层目前不允许我更改权限。

我在SO上看过几个答案,建议在执行getLastKnownLocation()之前调用以下内容,但这没有任何影响。

locationManager.requestLocationUpdates(
                        LocationManager.NETWORK_PROVIDER, 0, 0, new LocationListener() {
                            @Override
                            public void onStatusChanged(String provider, int status, Bundle extras) {
                            }

                            @Override
                            public void onProviderEnabled(String provider) {
                            }

                            @Override
                            public void onProviderDisabled(String provider) {
                            }

                            @Override
                            public void onLocationChanged(final Location location) {
                                // NEVER CALLED on Samsung S7 for LocationManager.NETWORK_PROVIDER
                            }
                        });

所以目前,我觉得这是新三星Galaxy S7独有的问题。

2 个答案:

答案 0 :(得分:2)

嗯,您正在呼叫isProviderEnabled(),因此至少应该覆盖这一点,并且应该启用使用网络位置。但是documentation的确切措辞是:

  

&#34;如果用户在“设置”菜单中启用了此提供程序,则为true   返回,否则返回false&#34;

所以它只是提供者正在启用&#34;因为没有被用户关闭。

有问题的手机(S7)内有SIM卡吗?在该特定设备上,基于网络的定位需要SIM卡或互联网连接。

参考documentation,您可以查看这些内容:

locationManager.getProvider(LocationManager.NETWORK_PROVIDER).requiresCell();
locationManager.getProvider(LocationManager.NETWORK_PROVIDER).requiresNetwork();

如果位置未知,当然只是调用getLastKnownLocation()会返回null。如果没有应用程序(您的或其他应用程序)专门请求设备确定其位置,那么它是未知的。因此,调用requestLocationUpdates()的建议是正确的建议。但是确定位置可能需要一段时间,因此在调用getLastKnownLocation()之后可能仍会返回null

即使它返回了某些内容,也可能是非常旧的数据甚至不再有效。那么为什么不只是subscribe to receive location updates?这就是它的意图。您正在使用基于网络的定位,因此它不会(完全/显着)影响功耗,如果您指定适合您需要的时间间隔和距离限制,则更新不会太频繁。

答案 1 :(得分:2)

根据我对三星设备的体验。如果您重新启动手机并且不启用GPS,则无法获得位置。如果您启用GPS作为某些点 - 也许通过运行Google地图,那么您将获得一个位置。除非在设备开机周期内获得位置,否则三星不会返回GPS,网络或被动提供商的位置。

我在代码中所做的任何调用都没有让它启动并激活并获取位置。它们在其他设备上运行良好。三星似乎也没有长时间缓存这些信息。

相关问题