2013-11-21 36 views
3
public class NativeGeolocation extends Plugin { 
    public long maximumAge = 1000 * 30; // ms 
    public long timeout = 1000 * 30; // ms 
    public Location lastPosition = null; 
    public static final String ACTION_GETCURRENTPOSITION="getCurrentPosition"; 
    protected String callbackId = null; 

    @Override 
    public PluginResult execute(String action, JSONArray data, String callbackId) 
    { 
    JSONObject options = data.optJSONObject(0); 
    Log.i("Myactivity","options : "+options); 
    this.timeout = timeout; 

    this.callbackId = callbackId; 
    Log.i("Myactivity","callbackId : "+this.callbackId); 
    PluginResult result = new PluginResult(Status.NO_RESULT, callbackId); 
    result.setKeepCallback(true); 
    final LocationManager locationManager = (LocationManager) ctx.getSystemService(Context.LOCATION_SERVICE); 

    Criteria criteria = new Criteria(); 

    String provider = locationManager.getBestProvider(criteria,false); 
    if (ACTION_GETCURRENTPOSITION.equals(action)) { 
     Log.i("Myactivity","inside getcurrentposition action"); 
     Location lastKnownLocation = locationManager.getLastKnownLocation(provider); 
     lastPosition = lastKnownLocation; 
     Log.i("Myactivity","last location "+lastKnownLocation); 
     if ((null != lastKnownLocation) && lastKnownLocation.getTime() + this.maximumAge > new Date().getTime()) { 
     Log.i("Myactivity","inside b4 gotLocation"); 
     gotLocation(lastKnownLocation); 
     } else { 
     ctx.runOnUiThread(new RunnableLocationListener(this, callbackId, locationManager, provider)); 
     } 
    } else { 
     error(new PluginResult(Status.INVALID_ACTION), callbackId); 
    } 
    return result; 
    } 

    public void gotLocation (Location location) { 
    Log.i("Myactivity","inside gotLocation"); 
    try { 
     Log.i("Myactivity","inside try"); 
     JSONObject geoposition = new JSONObject(); 
     JSONObject coords = new JSONObject(); 
     coords.put("latitude",   location.getLatitude()); 
     coords.put("longitude",  location.getLongitude()); 
     coords.put("altitude",   location.getAltitude()); 
     coords.put("accuracy",   location.getAccuracy()); 
     coords.put("altitudeAccuracy", null); 
     coords.put("heading",   null); 
     coords.put("speed",   location.getSpeed()); 
     geoposition.put("coords", coords); 
     geoposition.put("timestamp", location.getTime()); 
     geoposition.put("provider", location.getProvider()); 
     geoposition.put("lastPos", lastPosition); 
     success(new PluginResult(Status.OK, geoposition), callbackId); 
    } catch (JSONException jsonEx) { 
     error(new PluginResult(Status.JSON_EXCEPTION), callbackId); 
    } 
    } 

    protected String getBestProvider (LocationManager locationManager) { 
    String provider = LocationManager.PASSIVE_PROVIDER; 
    if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { 
     provider = LocationManager.GPS_PROVIDER; 
    } 
    else if (locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) { 
     provider = LocationManager.NETWORK_PROVIDER; 
    } 
    return provider; 
    } 

    class RunnableLocationListener extends Thread { 
    protected final NativeGeolocation plugin; 
    protected final LocationManager locationManager; 
    protected final String provider; 
    protected final String callbackId; 
    public Boolean ended = null; 
    public RunnableLocationListener (NativeGeolocation plugin, String callbackId, LocationManager locationManager, String provider) { 
     Log.i("Myactivity","inside runnabl"); 
     this.plugin = plugin; 
     this.locationManager = locationManager; 
     this.provider = provider; 
     this.callbackId = callbackId; 
    } 

    public void run() { 
     ended = false; 
     PluginResult result = null; 
     final LocationListener locationListener = new LocationListener() { 
     public void onLocationChanged (Location location) { 
      Log.i("Myactivity","calling getlocation again1"); 
      if (false == ended) { 
      Log.i("Myactivity","calling getlocation again2"); 
      plugin.gotLocation(location); 
      locationManager.removeUpdates(this); 
      } 
     } 
     public void onStatusChanged (String provider, int status, Bundle extras) { 
      Log.i("Myactivity","inside onStatus Changed"); 
    } 
     public void onProviderEnabled(String provider) { 
      Log.i("Myactivity","inside onProvider Enabled"); 
    } 
     public void onProviderDisabled(String provider) { 
      Log.i("Myactivity","inside onProvider Disabled"); 
    } 
     }; 
     locationManager.requestLocationUpdates(provider,1, 10, locationListener);//1 minutes and 10 meters 
     Thread timeouter = new Thread() { 
     public void run() { 
      try { 
      Thread.sleep(plugin.timeout); 
      ended = true; 
      locationManager.removeUpdates(locationListener); 
      plugin.error(new PluginResult(Status.ERROR, "timeout"), callbackId); 
      } catch (java.lang.InterruptedException ex) { 
      error(new PluginResult(Status.JSON_EXCEPTION), callbackId); 
      } 
     } 
     }; 
     timeouter.start(); 
    } 
    } 
} 

这是java插件n我打电话通过电话。 但它只有在互联网可用时才提供位置。我只需要使用GPS硬件而不是通过互联网获取位置。任何帮助?位置管理器不能在没有互联网的情况下工作

我重申了一些与此相关的stackoverflow问题。所以我知道GPS不会在建筑物内工作。好吧,但在我的情况下,它也不在外面工作。直到并且除非它没有得到最后的已知位置,否则它不起作用。一旦它有最后的位置一些如何开始工作。任何帮助?

编辑:根据这个链接Android - Trouble in getting location coordinates by only using GPS provider,我可以使用libwlocate。但如何使用它作为phonegap插件?任何帮助?

任何帮助,非常感谢。

编辑:如果我第一次把一些虚拟lastKnownLocation。那么它会要求新的一个权利?

+1

你需要记住,有时GPS在建筑物内不会工作裸露,所以给在阳台或东西一试。 – Coderji

+0

请检查网络关闭时是否收到任何异常? – Techfist

+0

@Techfist yup它给超时错误 – SSS

回答

1

您可以要求“仅通过GPS”像这样...

LocationProvider gpsProvider = locationManager.getProvider(LocationManager.GPS_PROVIDER); 
if(gpsProvider != null){ 
    locationManager.requestLocationUpdates(gpsProvider.getName(), 0, 0, this); 
} 


Boolean isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); 
Location lastLocation = null, gpsLocation = null; 
if (isGPSEnabled) 
    gpsLocation = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); 
相关问题