2

PhoneGap を使用するアプリケーションに取り組んでいます。現時点では、Android でのみテストしています。私のアプリケーションには、位置情報機能が必要なページがいくつかあります。

そこで、このコード行でそれを処理する JS を作成しました (もちろん、これは私独自のコード行ではありません): navigator.geolocation.watchPosition(successGeolocation, errorGeolocation, {maximumAge: 5000, enableHighAccuracy: true});

ジオロケーションは可能な限り正確である必要があるため、GPS を使用していますが、GPS の修正に時間がかかる場合があります。

問題は、ユーザーがあるページから別のページに移動するときです。WatchPosition の停止 (ユーザーが別のページをロードするため、これは正常です) を思い出すと、GPS を再度修正する必要があります。

非常に面倒なので、GPS を有効にしておくための解決策を探しています。誰かが私にアイデアを持っていますか? たぶん、プラグインまたはネイティブの Android LoC を使用して、アプリケーションの全期間にわたってアクティブに保つことができますか?

ありがとう。

4

1 に答える 1

2

最初のステップでは、位置データを受信するための API を提供する Android プラグインを作成する必要があります。

プラグインの作成は非常に簡単で、 プラグイン開発ガイドAndroid でのプラグインの開発 で説明されています。また、Cordova プラグインの作成例もここで見ることができます。

次に、ロケーション モニター クラスを作成します。シングルトンにして、メイン アクティビティから初期化できます。

これは、ニーズに合わせていくつかのソースと多くのテストからコンパイルした、単純ですが機能するコードです。主なコードは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 アプリで利用できます。

乾杯

于 2013-04-06T22:29:13.340 に答える