2012-04-03 14 views
1

Samsung Galaxy2(Android 2.3.5)のGPS位置を調べています。 SG2はA-GPSをサポートしていますので、GPS、Wifiネットワーク、センサーを利用しました。それはうまくいくように見えますが、時々GPSは私の現在の場所から50km以上離れた場所に完全に異なる場所を与えます。また、私はちょうど電話を1つの場所に置いても触れなかったにもかかわらず、場所が頻繁に変わります。Samsung Galaxy2のGPS位置が正しくない

私はまだAndroidに新しいので、この問題の原因がわかりません。以下は、GPSの場所を扱うソースコードです。:

public class LocationMonitor extends Service implements LocationListener,Runnable { 
    .... other local variables here 

    Object locationUpdateNotifier= null; 
    public static GeoPoint ourLocation; 


    public void synchronize() 
    { 
     if(ourLocation == null) 
     { 
      ourLocation = getLastKnownLocation(); 
      if(ourLocation == null) return; 
     } 

     //Load last time we synced 
     long lastSyncTime = some_value; 

     if(lastSyncTime < System.currentTimeMillis() - UPDATE_FREQ) //UPDATE_FREQ - default 30 minutes 
     { 
      handler.post(new Runnable() { 
       public void run() { 
        GpsPingTask pingTask = new GpsPingTask(context,String.valueOf(ourLocation.getLatitudeE6()/1E6),String.valueOf(ourLocation.getLongitudeE6()/1E6)); 
        pingTask.execute((Void)null); //Send location to server 
       } 
      }); 
      lastSyncTime = System.currentTimeMillis(); 
      //Save new lastSync time 
     } 
    } 



    public void kill() 
    { 
     if(locationManager !=null) 
      locationManager.removeUpdates(this); 
    } 

    public void onLocationChanged(Location location) { 
     try 
     { 
      //Read latitude and longitude from location 
      //Create Geo point so we can get a english street name address 
      ourLocation = new GeoPoint((int)(location.getLatitude()*1E6),(int)(location.getLongitude()*1E6)); 

      if(locationUpdateNotifier != null) 
      { 
       synchronized (locationUpdateNotifier) { 
        locationUpdateNotifier.notify(); 
       } 
      } 

      if(!doneFirstUpdate) 
      { 
       doneFirstUpdate =true; 
       Log.i("LocationMointor", "LocationMonitor.onLocationChanged() done first update at 0 frequency, resetting to normal speed"); 
       //Set it to update at the requested frequency 
       resetLocationUpdatesFreq(); 
      } 

      startSynchronizeThread(); 
     } 
     catch (Throwable e) { 
      Log.i("LocationMointor", "LocationMonitor.onLocationChanged(): " + e); 
     } 
    } 


    public void onProviderDisabled(
      String provider) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onProviderEnabled(String provider) {} 

    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) {} 


    public void setTemporaryLocationUpdateFreq(int pingFreqSecs) { 

     setTemporaryLocationUpdateFreq(pingFreqSecs, 10); 
    } 


    public void setTemporaryLocationUpdateFreq(int pingFreqSecs, int minimumDistanceMeters) { 
     if(!doneFirstUpdate) 
      doneFirstUpdate =true; 

     tempLocationUpdateFreq = pingFreqSecs; 
     tempLocationUpdateMeters = minimumDistanceMeters; 
     handler.post(new Runnable() 
     { 
      public void run() { 
       //Turn of location updates 
       if(locationManager !=null) 
        locationManager.removeUpdates(locationMonitor); 
       //Restart location updates with new frequency 
       locationManager.requestLocationUpdates(getGpsMode(), UPDATE_FREQ, tempLocationUpdateMeters,locationMonitor); 
       //locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, tempLocationUpdateFreq*1000, tempLocationUpdateMeters,locationMonitor); 
      } 
     }); 
    } 

    private void startSynchronizeThread() { 
     if(!running) 
      new Thread(this).start(); 
    } 


    public void resetLocationUpdatesFreq() { 
     locationUpdateNotifier = null; 
     handler.post(new Runnable() 
     { 
      public void run() { 
       //Turn of location updates 
       if(locationManager !=null) { 
        locationManager.removeUpdates(locationMonitor); 
        //Restart location updates with default location update frequency 
        //locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, MINIMUM_TIME_BETWEEN_UPDATE, MINIMUM_DISTANCECHANGE_FOR_UPDATE,locationMonitor); 
       } 
      } 
     }); 
    } 


    public void setLocationUpdateFreq(int pingFreqMins) { 

     Log.i("LocationMointor", "LocationMonitor.setLocationUpdateFreq().mode: " + getGpsMode() + "pingFreq:" + pingFreqMins); 

     //Save new frequency value 
     SharedPreferences pref = context.getSharedPreferences(PREF_PING_FREQ, Context.MODE_PRIVATE); 
     Editor prefEditor= pref.edit(); 
     prefEditor.putInt(PREF_PING_FREQ, 10); 
     prefEditor.commit(); 
     handler.post(new Runnable() 
     { 
      public void run() { 
       //Turn of location updates 
       if(locationManager !=null) 
        locationManager.removeUpdates(locationMonitor); 
       //Restart location updates with new piong frequency 
       locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, MINIMUM_TIME_BETWEEN_UPDATE, MINIMUM_DISTANCECHANGE_FOR_UPDATE,locationMonitor); 
      } 
     }); 

    } 


    public void addUpdateNotify(Object notifyable) 
    { 
     this.locationUpdateNotifier = notifyable; 
    } 


    public GeoPoint getLastKnownLocation() 
    { 
     Criteria crit = new Criteria(); 
     //Try get last known fine location 
     crit.setAccuracy(Criteria.ACCURACY_FINE); 
     String provider = locationManager.getBestProvider(crit, false); 
     Location loc = locationManager.getLastKnownLocation(provider); 
     //If we got no location, try coarse location 
     if(loc == null) 
     { 

      crit.setAccuracy(Criteria.ACCURACY_COARSE); 
      provider = locationManager.getBestProvider(crit, false); 
      loc = locationManager.getLastKnownLocation(provider); 
      //If nothing, return nothing 
      if(loc == null) 
      { 
       Log.i("LocationMointor", "LocationMonitor.getLastKnownLocation() got no location"); 
       return null; 
      } 
     } 

     //Create geopoint and return it. 
     GeoPoint geoPoint = new GeoPoint((int)(loc.getLatitude()*1E6),(int)(loc.getLongitude()*1E6)); 
     Log.i("LocationMointor", "LocationMonitor.getLastKnownLocation() got " +geoPoint); 

     return geoPoint; 
    } 

    @Override 
    public void run() { 
     running = true; 
     Object pauser = new Object(); 
     do{ 
      try 
      { 
       synchronize(); 
       synchronized(pauser) 
       { 
        pauser.wait(UPDATE_FREQ); 
       } 

      } 
      catch(Throwable ex) 
      { 
       Log.e("LocationMointor", "LocationMonitor.run() " +ex); 
      } 
     } 
     while(running); 
    } 

    public void onCreate() { 
     super.onCreate(); 

     this.context = this; 
     this.locationMonitor= this; 

     handler = new Handler(); 

     //Get the location manager service 
     locationManager = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE); 

     //Start gps to get our location 
     this.locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, UPDATE_FREQ, this); 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     kill(); 
    } 

    @Override 
    public IBinder onBind(Intent arg0) { 
     return mBinder; 
    } 

    private final IBinder mBinder = new MyBinder(); 

    public class MyBinder extends Binder { 
     public LocationMonitor getService() { 
      return LocationMonitor.this; 
     } 
    } 
} 

この問題を乗り越えるために手伝ってください。 ありがとうございます。

答えて

2

元のギャラクシーS電話とは異なり、GS2のGPSは問題なく動作します。

あなたのコードから判断すると、getLastKnownLocationを使用しています.GPSが利用できない場合は、Coarseに戻ります。だから私はちょうど起こっていると思う: - あなたは非常に時代遅れのGPSの場所 を取得している - または粗い場所とGoogleは非常にうまくあなたのエリアをマップしないのでオフです。

ログを追加するか、getLastKnownLocation()から取得したnull以外のロケーションオブジェクトのプロバイダとタイムスタンプをチェックすることで、これらの前提を確認できます。

+0

ポイントをありがとう。それは私がこの良いコミュニティを形成することを期待するものです。 – sunghun

+0

最高の答えを覚えておいてください。 –

0

あなたが実際のデバイス上の場所を確認して、同じ場所に留まっている場合、私はそれが場所から少し変わるかもしれないことに気付きました(GPSソフトウェアでは、あなたが運転している/動いている前に見ている)。したがって、場所のわずかな変更は可能ですが、通常は50kmではありません。デバイスに依存しているかどうかをテストする別のデバイスがありますか?その50 km?

+0

すぐに他のデバイスを用意します。 – sunghun

関連する問題