我正在尝试编写一个从“网络”提供商获取当前位置的 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 分钟)。
我采用的方法有问题吗?除了启用此功能所需的网络位置之外,还有其他方法可以获取我需要的网络位置,或者手机上的某些设置吗?在更基本的层面上,这里到底出了什么问题?