【问题标题】:trying to get location from "network" provider fails on some devices despite the provider being enabled尽管启用了提供程序,但在某些设备上尝试从“网络”提供程序获取位置失败
【发布时间】:2013-08-12 19:54:52
【问题描述】:

我正在尝试编写一个从“网络”提供商获取当前位置的 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) is not reliable, why?此问题的摘要),getLastKnownLocation 返回 null,并且在请求更新后我没有在合理的时间内收到更新(我已经等了 5 分钟)。

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

【问题讨论】:

  • 您是否检查过该特定版本的 cyanogenmod 9 和 Galaxy s2 是否存在错误?全球定位系统是否适用于地图等其他应用程序?还有其他明确的方法可以将 gps 功能添加到 xml 中,这可能会有所帮助。所有考虑到这一点的人似乎确实是这个特定的 rom 和手机的问题。
  • 其他应用程序肯定可以让它工作,所以我不认为这是一个具体的问题,我相信一定有解决方案。

标签: java android location


【解决方案1】:

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

【讨论】:

  • 我不知道任何来自 Google 的官方错误报告,但您可以查看 Android 开源项目 bug tracker。我还在 Android 4.2 和 4.3 上测试了基于 tutorial 的以下位置,没有问题。这可能很有趣,因为它处理位置管理的方式与您自己略有不同。
  • 这确实是一个错误,因为它也影响了我。我实现了在 Google Play Service API 中找到的位置服务并解决了它。我也喜欢该 API 附带的高级功能,因此我可能最终还是会转向该 API。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-09
  • 2021-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-13
相关资源
最近更新 更多