2014-10-11 1 views
1

Я попытался с помощью androidhive стандартных обучающий для поиска местоположения, но она не в определенном times.So я нашел еще один учебник по этой ссылке:Определения местоположения в Android, используя обучающие Гейбы Sechan в

http://gabesechansoftware.com/location-tracking/

Он использует два классы, которые реализуют интерфейс:

Первый класс:

package com.example.marinamapseg; 

import android.content.Context; 
import android.location.Location; 
import android.location.LocationManager; 

public class FallbackLocationTracker implements LocationTracker, LocationTracker.LocationUpdateListener { 


    private boolean isRunning; 

    private ProviderLocationTracker gps; 
    private ProviderLocationTracker net; 

    private LocationUpdateListener listener; 

    Location lastLoc; 
    long lastTime; 

    public FallbackLocationTracker(Context context) { 
     gps = new ProviderLocationTracker(context, ProviderLocationTracker.ProviderType.GPS); 
     net = new ProviderLocationTracker(context, ProviderLocationTracker.ProviderType.NETWORK); 
    } 

    public void start(){ 
     if(isRunning){ 
      //Already running, do nothing 
      return; 
     } 

     //Start both 
     gps.start(this); 
     net.start(this); 
     isRunning = true; 
    } 

    public void start(LocationUpdateListener update) { 
     start(); 
     listener = update; 
    } 


    public void stop(){ 
     if(isRunning){ 
      gps.stop(); 
      net.stop(); 
      isRunning = false; 
      listener = null; 
     } 
    } 

    public boolean hasLocation(){ 
     //If either has a location, use it 
     return gps.hasLocation() || net.hasLocation(); 
    } 

    public boolean hasPossiblyStaleLocation(){ 
     //If either has a location, use it 
     return gps.hasPossiblyStaleLocation() || net.hasPossiblyStaleLocation(); 
    } 

    public Location getLocation(){ 
     Location ret = gps.getLocation(); 
     if(ret == null){ 
      ret = net.getLocation(); 
     } 
     return ret; 
    } 

    public Location getPossiblyStaleLocation(){ 
     Location ret = gps.getPossiblyStaleLocation(); 
     if(ret == null){ 
      ret = net.getPossiblyStaleLocation(); 
     } 
     return ret; 
    } 

    public void onUpdate(Location oldLoc, long oldTime, Location newLoc, long newTime) { 
     boolean update = false; 

     //We should update only if there is no last location, the provider is the same, or the provider is more accurate, or the old location is stale 
     if(lastLoc == null){ 
      update = true; 
     } 
     else if(lastLoc != null && lastLoc.getProvider().equals(newLoc.getProvider())){ 
      update = true; 
     } 
     else if(newLoc.getProvider().equals(LocationManager.GPS_PROVIDER)){ 
      update = true; 
     } 
     else if (newTime - lastTime > 5 * 60 * 1000){ 
      update = true; 
     } 

     if(update){ 
      lastLoc = newLoc; 
      lastTime = newTime; 
      if(listener != null){ 
       listener.onUpdate(lastLoc, lastTime, newLoc, newTime);     
      } 
     } 
    } 
} 

Второй класс:

package com.example.marinamapseg; 

import android.content.Context; 
import android.location.Location; 
import android.location.LocationListener; 
import android.location.LocationManager; 
import android.os.Bundle; 

public class ProviderLocationTracker implements LocationListener, LocationTracker { 

    // The minimum distance to change Updates in meters 
    private static final long MIN_UPDATE_DISTANCE = 0; 

    // The minimum time between updates in milliseconds 
    private static final long MIN_UPDATE_TIME = 0; 

    private LocationManager lm; 

    public enum ProviderType{ 
     NETWORK, 
     GPS 
    };  
    private String provider; 

    private Location lastLocation; 
    private long lastTime; 

    private boolean isRunning; 

    private LocationUpdateListener listener; 

    public ProviderLocationTracker(Context context, ProviderType type) { 
     lm = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE); 
     if(type == ProviderType.NETWORK){ 
      provider = LocationManager.NETWORK_PROVIDER; 
     } 
     else{ 
      provider = LocationManager.GPS_PROVIDER; 
     } 
    } 

    public void start(){ 
     if(isRunning){ 
      //Already running, do nothing 
      return; 
     } 

     //The provider is on, so start getting updates. Update current location 
     isRunning = true; 
     lm.requestLocationUpdates(provider, MIN_UPDATE_TIME, MIN_UPDATE_DISTANCE, this); 
     lastLocation = null; 
     lastTime = 0; 
     return; 
    } 

    public void start(LocationUpdateListener update) { 
     start(); 
     listener = update; 

    } 


    public void stop(){ 
     if(isRunning){ 
      lm.removeUpdates(this); 
      isRunning = false; 
      listener = null; 
     } 
    } 

    public boolean hasLocation(){ 
     if(lastLocation == null){ 
      return false; 
     } 
     if(System.currentTimeMillis() - lastTime > 5 * MIN_UPDATE_TIME){ 
      return false; //stale 
     } 
     return true; 
    } 

    public boolean hasPossiblyStaleLocation(){ 
     if(lastLocation != null){ 
      return true; 
     } 
     return lm.getLastKnownLocation(provider)!= null; 
    } 

    public Location getLocation(){ 
     if(lastLocation == null){ 
      return null; 
     } 
     if(System.currentTimeMillis() - lastTime > 5 * MIN_UPDATE_TIME){ 
      return null; //stale 
     } 
     return lastLocation; 
    } 

    public Location getPossiblyStaleLocation(){ 
     if(lastLocation != null){ 
      return lastLocation; 
     } 
     return lm.getLastKnownLocation(provider); 
    } 

    public void onLocationChanged(Location newLoc) { 
     long now = System.currentTimeMillis(); 
     if(listener != null){ 
      listener.onUpdate(lastLocation, lastTime, newLoc, now); 
     } 
     lastLocation = newLoc; 
     lastTime = now; 
    } 

    public void onProviderDisabled(String arg0) { 

    } 

    public void onProviderEnabled(String arg0) { 

    } 

    public void onStatusChanged(String arg0, int arg1, Bundle arg2) { 
    } 
} 

Но проблема в том, что он не упомянул о том, как использовать следующие два класса в андроида app.So я попытался следующие:

FallbackLocationTracker fobj; 

fobj=new FallbackLocationTracker(MainActivity.this); 
    fobj.start(); 
    if(fobj.hasLocation()) 
    { 
     Location locobj=fobj.getLocation(); 
     current_latitude=locobj.getLatitude(); 
     current_longitude=locobj.getLongitude(); 
     Toast.makeText(getApplicationContext(),current_latitude+" "+current_longitude,Toast.LENGTH_LONG).show(); 
     placemarkersonmap(); 
    } 

Когда я отладки кода метода hasLocation возвращает false, поскольку метод onLocationChanged в первом классе получает вызов только после вызова метода haslocation. Таким образом, объект lastlocation будет иметь значение null и false.

Но почему оленья кожа onlocationchanged дозвонились как только следующая строка работает:

lm.requestLocationUpdates(provider, MIN_UPDATE_TIME, MIN_UPDATE_DISTANCE, this); 

Или есть какой-нибудь способ somenone может сказать мне, как использовать помощь code.Please !!

ответ

1

onLocationChanged - это обратный вызов, что означает, что он управляется событиями и не запускается до тех пор, пока устройство не обнаружит изменение местоположения. Если вы занимаете место только с GPS, это может занять несколько минут, прежде чем вы получите исправление. Если вы находитесь в помещении без четкого представления о небе, то он, возможно, никогда не запустится.

1

Вы можете добавить следующее в OnCreate метод вашего actitvity в:

@Override 
 
    protected void onCreate(Bundle savedInstanceState) { 
 
    super.onCreate(savedInstanceState); 
 
    setContentView(R.layout.activity_main); 
 
    textViewHeading = (TextView) this.findViewById(R.id.text_heading); 
 
    textViewLong = (TextView) this.findViewById(R.id.text_long); 
 
    textViewLat = (TextView) this.findViewById(R.id.text_lat); 
 
    textViewHeight = (TextView) this.findViewById(R.id.text_height); 
 
    textViewAccuracy = (TextView) this.findViewById(R.id.text_accuracy); 
 
    
 
    counter = (long) 0; 
 
    
 
    gps = new ProviderLocationTracker(this, 
 
     ProviderLocationTracker.ProviderType.GPS); 
 
    listener = new LocationUpdateListener() { 
 

 
     @Override 
 
     public void onUpdate(Location oldLoc, long oldTime, Location newLoc, 
 
      long newTime) { 
 
     // TODO Auto-generated method stub 
 
     
 
     counter = counter + (long) 1; 
 
     if (gps.hasLocation()) { 
 
     text1="GPS has location (" + counter.toString() + ")"; 
 
     } else { 
 
     text1="GPS has no location (" + counter.toString() + ")"; 
 
     } 
 
     
 
     if (gps.hasPossiblyStaleLocation()) { 
 
     text1 = text1 + " plus stale location"; 
 
     } 
 
     
 
     Double longitude = newLoc.getLongitude(); 
 
     Double latitude = newLoc.getLatitude(); 
 
     Double height = newLoc.getAltitude(); 
 
     Float accuracy = newLoc.getAccuracy(); 
 
       
 
     text2 = "Longitude = " + longitude.toString(); 
 
     text3 = "Latitude = " + latitude.toString(); 
 
     text4 = "Altitude = " + height.toString(); 
 
     text5 = "Accuracy = " + accuracy.toString(); 
 
       
 
     textViewHeading.setText(text1); 
 
     textViewLong.setText(text2); 
 
     textViewLat.setText(text3); 
 
     textViewHeight.setText(text4); 
 
     textViewAccuracy.setText(text5); 
 
     } 
 
     
 
    }; 
 
    gps.start(listener); 
 
    
 
    } // end method onCreate

+0

Было бы хорошо, чтобы знать, как использовать запасной вариант местоположения трекера. –

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