2010-11-30 64 views
1

我正在写一个地理应用程序,它可以很好地工作,但我正在考虑如何在没有GPS或3G的设备上工作,并且WiFi可能关闭或不提供位置信息。如何判断Android设备是否能够提供位置?

是我最好的选择,只是请求位置更新(或使用最后一次已知)并假设有一种方法来获取位置(无论是GPS还是网络),还是框架包含一种方法来查看可用的方法,以及避免地理查找延迟?

我在没有GPS的设备上绘图我的应用应该为用户指定位置提供一个UI,并在sharedprefs中记住它,以便它们不必重新输入它(我在考虑设备如Google TV和平板电脑)。

对于如何处理在具有不同级别的地理位置的各种设备环境中获取位置的过程以及如何处理这些建议,我将不胜感激。

回答

1

您可以调用LocationManager.getAllProviders()来检索所有位置提供程序,或调用LocationManager.getProviders(true)来检索活动位置提供程序。

boolean hasActiveLocationProvider = false; 
LocationManager locationManager = Context.getSystemService(Context.LOCATION_SERVICE); 
List<String> providers = locationManager.getProviders(true); 
for (String providerName:providers) { 
    if (providerName.equals(LocationManager.GPS_PROVIDER) 
     || providerName.equals(LocationManager.NETWORK_PROVIDER)) { 
    hasActiveLocationProvider = true; 
    } 
} 

http://developer.android.com/reference/android/location/LocationManager.html

+0

看来,这只告诉我有什么理论提供者,而不是现在有什么实际可用的。例如如果我在带GPS的设备上运行上述代码并关闭所有网络,它仍会返回两个项目,即GPS和NETWORK。我需要比这更多的细节,我需要知道哪些是可用的,或者至少打开了,是否有API来做到这一点? – 2011-01-20 17:16:11

0

扩展aleung的和奥利的回答这是为我工作最好的。可能还有几个需要填补的空白。

private boolean hasActiveLocationProvider(Context context) { 
    LocationManager locationManager = (LocationManager) context 
      .getSystemService(Context.LOCATION_SERVICE); 
    List<String> providers = locationManager.getProviders(true); 
    for (String providerName : providers) { 
     if (providerName.equals(LocationManager.GPS_PROVIDER)) { 
      return true; 
     } 
     if (providerName.equals(LocationManager.NETWORK_PROVIDER)) { 
      ConnectivityManager cm = (ConnectivityManager) context 
        .getSystemService(Context.CONNECTIVITY_SERVICE); 
      boolean isConnected = cm.getActiveNetworkInfo() != null 
       && cm.getActiveNetworkInfo().isConnectedOrConnecting(); 
      if (isConnected) { 
       return true; 
      } 
     } 
    } 
    return false; 
} 
相关问题