在 Android 上使用 PhoneGap 进行地理定位
Posted
技术标签:
【中文标题】在 Android 上使用 PhoneGap 进行地理定位【英文标题】:Geolocation with PhoneGap on Android 【发布时间】:2013-04-05 09:39:45 【问题描述】:我正在开发一个使用 PhoneGap 的应用程序。目前,我只在 android 上测试它。我的应用程序中有几个页面需要地理定位功能。
所以我用这行代码做了一个JS来处理它(当然这不是我唯一的代码行): navigator.geolocation.watchPosition(successGeolocation, errorGeolocation, maximumAge: 5000, enableHighAccuracy: true);
地理位置需要尽可能准确,因此我使用 GPS,但 GPS 定位可能需要一些时间。
问题是当用户从一个页面导航到另一个页面时。 WatchPosition 停止(这是正常的,因为用户加载了另一个页面),当我想起它时,GPS 需要再次修复。
这很烦人,我搜索了一个解决方案来保持 GPS 处于活动状态。有人对我有想法吗?也许通过插件或原生 Android LoC,我可以在整个应用程序生命周期内保持其活跃?
谢谢。
【问题讨论】:
我找到了一个可能的解决方法,但它非常难看,我不想这样做......我可以制作一个页面来嵌入我的 JS,然后为每个屏幕创建一个 DIV它。然后我隐藏除我想要查看的 DIV 之外的所有 DIV,但使用此解决方案,我将所有 html 代码放在一个文件中! 【参考方案1】:第一步,您应该创建一个 Android 插件,该插件将为您提供用于接收位置数据的 API。
创建一个插件非常简单,这里有解释: Plugin Development Guide 和 Developing a Plugin on Android。 您还可以查看创建 Cordova 插件 here 的示例。
接下来,创建一个位置监视器类。您可以将其设为单例并从您的主要活动中对其进行初始化。
这是一个简单但有效的代码,我从多个来源和许多测试编译来满足我的需求。 主要代码取自here,尽管我尽可能地对其进行了简化。
public class LocationMonitor
private LocationListener locationListener = null;
private LocationManager locationManager = null;
private Location location = null;
public LocationMonitor()
public void startGPSActivity(Context context)
LocationLooper looper = new LocationLooper();
looper.start();
while (!looper.isReady())
looper.handler.post(new LocationBootstrapper(context));
public void stopGPSActivity()
locationManager.removeUpdates(locationListener);
public Location getLocation()
return location;
private class LocationLooper extends Thread
private Handler handler;
private LocationLooper()
public void run()
Looper.prepare();
this.handler = new Handler();
Looper.loop();
public boolean isReady()
return this.handler != null;
private class LocationBootstrapper implements Runnable
private Context context;
private LocationBootstrapper(Context context)
this.context = context;
public void run()
locationListener = new LocationListenerImpl();
locationManager = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 1, locationListener);
private class LocationListenerImpl implements LocationListener
private LocationListenerImpl()
@Override
public void onLocationChanged(Location location)
LocationMonitor.this.location = location;
Log.i("LocationMonitor", "New location: lat= " + location.getLatitude() + " lng=" + location.getLongitude() + " acc=" + location.getAccuracy());
@Override
public void onProviderDisabled(String provider)
@Override
public void onProviderEnabled(String provider)
@Override
public void onStatusChanged(String provider, int status, Bundle extras)
现在从您的插件访问 LocationMonitor 类,您就有了所需的解决方案 - 页面更改不会重新初始化您的 GPS,并且您的 PhoneGap 应用可以使用位置数据。
干杯
【讨论】:
谢谢,我会尽快尝试您的解决方案 :)以上是关于在 Android 上使用 PhoneGap 进行地理定位的主要内容,如果未能解决你的问题,请参考以下文章
Phonegap:解析不在 ios 或 android 上初始化
在 android 和 IOS 中运行 phoneGap 应用程序需要进行啥配置?
在 Android 中使用 JWplayer 在 Phonegap 中进行流式视频播放