2

我在使用 PhoneGap 的应用程序上工作。目前,我只在 Android 上测试它。我的应用程序中有几个页面需要地理定位功能。

所以我用这行代码做了一个JS来处理它(当然这不是我唯一的代码行):navigator.geolocation.watchPosition(successGeolocation, errorGeolocation, {maximumAge: 5000, enableHighAccuracy: true});

地理位置需要尽可能准确,因此我使用 GPS,并且可能需要一些时间才能进行 GPS 定位。

问题是当用户从一个页面导航到另一个页面时。WatchPosition 停止(这是正常的,因为用户加载了另一个页面),当我回忆起它时,GPS 需要再次修复。

这很烦人,我搜索了一个解决方案来保持 GPS 处于活动状态。有人对我有想法吗?也许通过插件或原生 Android LoC,我可以在整个应用程序生命周期中保持其活跃?

谢谢。

4

1 回答 1

2

第一步,您应该创建一个 Android 插件,该插件将为您提供用于接收位置数据的 API。

创建插件非常简单,在此处进行了说明: 插件开发指南在 Android 上开发插件您还可以在此处查看创建 Cordova 插件的示例。

接下来,创建一个位置监视器类。您可以将其设为单例并从您的主要活动中对其进行初始化。

这是一个简单但有效的代码,我从多个来源和许多测试中编译来满足我的需求。主要代码取自这里,尽管我尽可能地对其进行了简化。

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 应用程序可以使用位置数据。

干杯

于 2013-04-06T22:29:13.340 回答