2012-04-25 6 views
0

J'ai une classe de threads singelton qui envoie le point GPS à mon serveur. La classe contient et actualise la position du GPS.Impossible de trouver l'emplacement GPS

FinderThread:

public class FinderThread extends Thread { 
    private static FinderThread SINGLETON; 
    public boolean isinterrupt = true; 
    public int maxage; 
    public int minage; 
    public int distance; 
    public String gender; 
    public String latitude; 
    public String longitude; 
    public String sid; 
    public Context ctx; 
    LocationManager gps; 
    boolean nav; 
    SharedPreferences pref; 
    private Handler dlh; 
    private Handler myLocationHandler; 
    boolean pause=false; 




    private FinderThread(Context ctx,Handler dlh, Handler myLocationHandler) { 
     this.ctx = ctx; 

     gps = (LocationManager) ctx.getSystemService(Context.LOCATION_SERVICE); 
     gps.requestLocationUpdates(LocationManager.GPS_PROVIDER,60000, 20, llistener); 

     pref = ctx.getSharedPreferences("NFF", 0); 
     sid = pref.getString("sid", ""); 

     this.dlh = dlh; 

     if (myLocationHandler!=null) 
     { 
      this.myLocationHandler = myLocationHandler; 
     } 
     if(myLocationHandler != null) 
     { 
      myLocationHandler.sendEmptyMessage(0); 
     } 

    } 
    public static synchronized FinderThread getInstance(Context ctx,Handler dlh, Handler myLocationHandler) 
    { 
     if (SINGLETON == null) // falls null 
     { 
       SINGLETON = new FinderThread (ctx,dlh,myLocationHandler);//instanzieren 
     } 
     else 
     { 
      SINGLETON.myLocationHandler= myLocationHandler; 
      SINGLETON.dlh = dlh; 
      myLocationHandler.sendEmptyMessage(0); 
     } 
     return SINGLETON; 
    } 

    /* 
    @Override 
    public synchronized void start() { 
     if(SINGLETON != null) 
     { 
      SINGLETON.start(); 
     } 
    } 
    public synchronized void pause() 
    { 
     if(SINGLETON.getState()==State.RUNNABLE || SINGLETON.getState()==State.WAITING) 
     { 
       SINGLETON.pause = true; 

     } 
    } 
    public synchronized void tcontinue() 
    { 
     if(SINGLETON.getState()==State.RUNNABLE || SINGLETON.getState()==State.WAITING) 
     { 
       SINGLETON.pause = false; 

     } 
    } 
    public synchronized boolean isPaused() 
    { 
     return SINGLETON.pause; 
    } 
    */ 

    public synchronized void pause() 
    { 
     this.pause = true; 
    } 
    public synchronized boolean isPaused() 
    { 
     return this.pause; 
    } 
    public synchronized void tcontinue() 
    { 
       this.pause = false; 
    } 

    @Override 
    public void run() { 
     //String locationProvider = LocationManager.GPS_PROVIDER; 
     //Location lastpoint = gps.getLastKnownLocation(locationProvider); 

     //longitude = String.valueOf(lastpoint.getLongitude()); 
     //latitude = String.valueOf(lastpoint.getLatitude()); 

     try 
     { 
      while (isinterrupt) { 
       if(!pause) 
       { 
        Log.e("NFF", "Finder Thread Begin"); 
        RestConnection r = new RestConnection("finder", dlh, "POST"); 
        r.setParameter("minage", String.valueOf(minage)); 
        r.setParameter("maxage", String.valueOf(maxage)); 
        r.setParameter("distance", String.valueOf(distance)); 
        r.setParameter("gender", String.valueOf(gender)); 
        r.setParameter("latitude", String.valueOf(latitude)); 
        r.setParameter("longitude", String.valueOf(longitude)); 
        r.setParameter("sid", sid); 
        Log.e("NFF Finder Paramater", String.valueOf(minage)+" "+String.valueOf(maxage)+" "+String.valueOf(distance)+" "+String.valueOf(gender) + " "+String.valueOf(latitude)+" " +String.valueOf(longitude)+ " " + sid ); 

        r.start(); 
       } 

       Thread.sleep(10000); 
      } 
     } 
     catch (InterruptedException e) { 
      Log.e("NFF FT", "InterruptedException"); 
      isinterrupt = false; 
     } 
    } 
    private LocationListener llistener = new LocationListener(){ 

     @Override 
     public void onLocationChanged(Location location) { 
      if(String.valueOf(location.getLatitude())!= null) 
      { 
       latitude = String.valueOf(location.getLatitude()); 
       longitude = String.valueOf(location.getLongitude()); 
       if(myLocationHandler != null) 
       { 
        myLocationHandler.sendEmptyMessage(0); 
       } 
      } 


     } 

     @Override 
     public void onProviderDisabled(String provider) { 
      Log.e("NFF", "GPS Disabled"); 
      isinterrupt = true; 

     } 

     @Override 
     public void onProviderEnabled(String provider) { 
      Log.e("NFF", "GPS Enabled"); 

     } 

     @Override 
     public void onStatusChanged(String provider, int status, Bundle extras) { 
      // TODO Auto-generated method stub 

     } 

    }; 
    public void saveProperties() 
    { 
     Editor editor = pref.edit(); 
     editor.putInt("maxage", maxage); 
     editor.putInt("minage", minage); 
     editor.putInt("distance", distance); 
     editor.putString("gender", gender); 
     editor.putString("lat", latitude); 
     editor.putString("long", longitude); 
     editor.commit(); 

    } 
    public void loadProperties() 
    { 
     maxage = pref.getInt("maxage", -1); 
     minage = pref.getInt("minage", -1); 
     distance = pref.getInt("distance", -1); 
     gender = pref.getString("gender", "f"); 
     latitude = pref.getString("lat", "f"); 
     longitude = pref.getString("long", "f"); 
    } 
    public synchronized void pushSettings() 
    { 
     SINGLETON.maxage = maxage; 
     SINGLETON.minage = minage; 
     SINGLETON.distance = distance; 
     SINGLETON.gender = gender; 
     SINGLETON.latitude = latitude; 
     SINGLETON.longitude = longitude; 
    } 




} 

Quand je teste mon application sur l'émulateur et régler la position avec le contrôle de l'émulateur everthing travail bien. Quand je le teste sur mon téléphone, le droïde ne trouve pas la position. J'ai testé l'application "GPS Test", là elle trouve la position dans les 3 minutes avec 5 satellites.

S'il vous plaît aider

+0

faites-vous des essais à l'extérieur ou à l'intérieur?, Car le gps ne fonctionne pas à l'intérieur. –

+0

en plein air -> j'ai écrit que l'application "gps test" a trouvé l'emplacement – user547995

+0

Avez-vous essayé de réduire le temps entre les notifications et la distance requise pour déclencher une notification? – dymmeh

Répondre

0

Il sûr semble que vous avez tout ce qu'il ya.

Vous vous donnez la permission dans le manifeste pour FINE_LOCATION, non?

La seule suggestion que je voudrais faire est de changer votre requestLocationUpdates() afin qu'il demande des correctifs avec 0 temps entre eux et 0 distance entre eux. Tous les récepteurs GPS que j'ai vu vous donneront des correctifs environ une fois par seconde avec ce paramètre, ce qui est à peu près la façon dont la plupart des moteurs GPS fonctionnent. Juste sur le hasard que la minute et 20 m que vous mettez dans votre demande vous fout en l'air. Si vous obtenez des correctifs avec cette suggestion, vous pouvez travailler à partir de là pour minimiser le temps passé sur GPS.

Bonne chance!