2013-04-05 3 views
2

PhoneGap을 사용하는 애플리케이션에서 작동합니다. 지금은 Android에서만 테스트합니다. 내 응용 프로그램에 Geolocation 기능이 필요한 여러 페이지가 있습니다. navigator.geolocation.watchPosition (successGeolocation, errorGeolocation, {사실 maximumAge를 : : : 5000, enableHighAccuracy}) Android에서 PhoneGap을 사용하는 Geolocation

그래서 나는 코드 행 (물론 내 고유 코드의 라인이 아니다) 그것을 처리하는 JS했다 ;

Geolocation은 GPS를 사용하는 데 가장 정확해야하므로 GPS 수정이 필요합니다.

문제는 사용자가 한 페이지에서 다른 페이지로 이동할 때 발생합니다. WatchPosition은 멈 춥니 다 (사용자가 다른 페이지를로드했기 때문에 정상입니다) 그리고 GPS를 다시 호출해야합니다.

매우 성가신 일이며 GPS를 계속 사용하기위한 해결책을 모색 중입니다. 누군가 나를 생각해? 어쩌면 플러그인이나 기본 Android LoC를 사용하여 모든 응용 프로그램 수명 동안 활성 상태로 유지할 수 있습니까?

감사합니다.

+0

나는 가능한 수정을 찾았지만 매우 추한 나는 그렇게하고 싶지 않아 ... 내 JS를 embeed 다음 각 화면에 대한 DIV를 생성 한 페이지를 만들 수 있습니다 그것. 그럼 내가보고 싶은 것을 제외하고 모든 DIV를 숨기지 만,이 솔루션을 사용하면 하나의 단일 파일에 모든 HTML 코드가 있습니다! – Gaetan

답변

2

첫 번째 단계에서는 위치 데이터를 수신하기위한 API를 제공하는 Android 플러그인을 만들어야합니다.

플러그인을 만드는 것은 매우 쉽고 여기에 설명되어 있습니다. Plugin Development GuideDeveloping a Plugin on Android. 코도 바 플러그인 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를 다시 초기화되지 않고 위치 데이터가 폰갭 응용 프로그램에 사용할 수 있습니다.

건배

+0

고마워, 나는 너의 해결책을 곧 시도 할 것이다 :) – Gaetan

관련 문제