1

我正在尝试编写一个从“网络”提供商获取当前位置的 Android 应用程序(所以我只需要android.permission.ACCESS_COARSE_LOCATION许可)。这在某些设备上运行良好,但在其他设备上我似乎无法获得位置更新。这是我的代码。

在 onCreate 中:

    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    provider = LocationManager.NETWORK_PROVIDER;
    Log.v (TAG, "Finding location from provider: " + provider);
    if (CHECK_PROVIDER_ENABLED && !locationManager.isProviderEnabled (provider))
    {
        Toast.makeText (this, "Location provider disabled", Toast.LENGTH_LONG).show ();
    }
    else
    {
        try
        {
            Location location = locationManager.getLastKnownLocation(provider);
            if (location == null)
            {
                Log.i (TAG, "getLastKnownLocation returned null, requesting updates when available");
                locationManager.requestLocationUpdates (provider, 0, 0, locationListener);
            }
            else
                locationListener.onLocationChanged (location);
        }
        catch (IllegalArgumentException e)
        {
            Log.e(TAG, "Failed to get location from provider " + provider, e);
            Toast.makeText (this, "Location provider disabled", Toast.LENGTH_LONG).show ();
        }
    }

locationListener 定义如下:

private LocationListener locationListener = 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 (Location location)
    {
        Toast.makeText (CarouselViewerActivity.this, "" + location.getLatitude () + ", " + location.getLongitude (), Toast.LENGTH_LONG).show ();
        Log.v(TAG, "" + location.getLatitude () + ", " + location.getLongitude ());
        locationManager.removeUpdates (this);
    }
};

在可以工作的手机上,这里的一切工作正常:如果 CHECK_PROVIDER_ENABLED 为真,则isProviderEnabled测试返回真,getLastKnownLocation返回一个位置而不是空值,如果我强制更新请求,我会收到一个包含位置详细信息的请求。

但是在其他手机上(我正在测试的特定手机是带有 Cyanogenmod 9 的 Galaxy S2)isProviderEnabled测试返回 false(尽管启用网络位置的设置项已打开 - 请参阅LocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER) 不可靠,为什么?有关此问题的摘要),getLastKnownLocation返回 null,并且在请求更新后,我没有在合理的时间内收到更新(我已经等了 5 分钟)。

我采用的方法有问题吗?除了启用此功能所需的网络位置之外,还有其他方法可以获取我需要的网络位置,或者手机上的某些设置吗?在更基本的层面上,这里到底出了什么问题?

4

1 回答 1

1

与 Android 网络提供商相关的类似问题之前已在 Stack Overflow 上报告过,您可以在此处找到。经历过此问题的人一致认为,有两种可能的解决方法,即在问题变得明显时重新启动设备,或者使用Google Play 服务 API 检索位置数据,因为似乎存在可靠性问题使用 Android 4.0 或更高版本的位置管理器。

于 2013-08-12T20:15:41.170 回答