2013-04-05 2 views
2

Я работаю над приложением, использующим PhoneGap. На данный момент я тестирую только Android. У меня есть несколько страниц в моем приложении, которые нуждаются в функции геолокации.Геолокация с помощью PhoneGap на Android

Так что я сделал JS, чтобы справиться с этой строки кода (конечно, это не моя единственная строка кода): navigator.geolocation.watchPosition (successGeolocation, errorGeolocation, {maximumAge: 5000, enableHighAccuracy: истинный}) ;

Геолокация должна быть максимально возможной, поэтому я использую GPS, и может потребоваться некоторое время, чтобы получить GPS-Fix.

Проблема заключается в том, что пользователь переходит с одной страницы на другую. Стоп WatchPosition (это нормально, потому что пользователь загружает другую страницу), и, когда я вспоминаю, GPS необходимо снова исправить.

Это очень раздражает, и я ищу решение, чтобы поддерживать GPS. У кого-то есть идея для меня? Может быть, с плагином или родным Android LoC я могу сохранить его активным во время всей жизни приложения?

Спасибо.

+0

Я нашел возможное решение, но это очень некрасиво, и я не хочу, чтобы сделать это ... Я могу сделать одну страницу embeed мой JS, а затем создать DIV для каждого экрана в Это. Затем я скрываю все DIV, кроме тех, которые я хочу просмотреть, но с этим решением у меня есть весь код HTML в одном файле! – Gaetan

ответ

2

На первом этапе вы должны создать плагин Android, который предоставит вам API для получения данных о местоположении.

Создание плагина довольно просто и объясняется здесь: Plugin Development Guide и Developing a Plugin on Android. Вы также можете увидеть пример создания плагина Cordova here.

Затем создайте класс монитора местоположения. Вы можете сделать его singleton и инициализировать его из вашего основного вида деятельности.

Вот простой, но рабочий код, который я скомпилировал из нескольких источников и многих тестов в соответствии с моими потребностями. Основной код взято из 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.

Приветствия

+0

Спасибо, я попробую ваше решение очень скоро :) – Gaetan

Смежные вопросы