2011-09-03 4 views
1

Existe-t-il un moyen de détecter très rapidement le nouvel emplacement en utilisant le fournisseur GPS?Fournisseur GPS et ses performances

+0

Utilisez le fournisseur de réseau ... Merci – st0le

+0

mais pourquoi fournisseur de GPS très lent pour détecter l'emplacement? – Dev

+0

Merci stl0e & Jonas ... – Dev

Répondre

6

Le GPS est souvent lent - c'est comme ça. Mais il y a plusieurs choses que vous pouvez faire afin d'accélérer l'expérience pour l'utilisateur:

  • Commencez à chercher un endroit dès que l'application démarre - ne pas attendre jusqu'à ce qu'ils arrivent à une activité qui a besoin un emplacement

  • Utilisez le fournisseur de réseau, ce qui est souvent beaucoup plus rapide

  • Utilisez le fournisseur passif. Utiliser les informations de localisation acquises par d'autres applications sur l'appareil

  • Utilisez le dernier emplacement connu - il est stocké pendant un certain temps, et s'il existe, il vous donne un emplacement instantanément (même s'il est peut-être un peu ancien)

  • Si approprié dans votre contexte d'application, stocker un emplacement vous dans prefs

Cet article de Reto Meier de Google est un excellent endroit pour commencer - regarder les liens connexes pour des exemples de code et plus en détail http://blog.radioactiveyak.com/2011/06/how-to-build-location-based-apps-that.html

+0

thnks olie c mais je pense que le fournisseur de réseau n'est pas plus précis que le fournisseur GPS. Et comment puis-je utiliser l'emplacement lastKnown pour détecter un nouvel emplacement? – Dev

+2

Regardez sous "Obtenir une solution rapide avec le dernier emplacement connu" sur cette page. C'est facile http://developer.android.com/guide/topics/location/obtaining-user-location.html –

0

U peut récupérer l'emplacement via le fournisseur de réseau et le fournisseur GPS.

Vous pouvez vérifier simultanément les deux fournisseurs si vous souhaitez une récupération rapide de l'emplacement. Voici le code ..

Créer une classe comme cette première:

import android.content.Context; 
import android.content.Intent; 
import android.location.Location; 
import android.location.LocationListener; 
import android.location.LocationManager; 
import android.os.Bundle; 
import android.os.Handler; 
import android.provider.Settings; 
import android.util.Log; 
import android.widget.Toast; 

import com.tcs.android.eventinfo.data.DataStore; 



public class GeoFence { 
// public Timer timer1; 
LocationManager lm; 
LocationResult locationResult; 
boolean gps_enabled=false; 
boolean network_enabled=false; 
Context mContext; 

public Handler handler; 
public GetLastLocation r; 
public boolean isLocationNullSecondTime=false; 

public GeoFence(Context context) { 
    mContext=context; 
    handler = new Handler(); 
    chekStatusOfLocationProvider(isLocationNullSecondTime); 
} 
public void chekStatusOfLocationProvider(boolean isLocationNullSecondTime){ 
    if(lm==null) 
     lm = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE); 

    Log.i("GPS"," GPS"+lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER)); 
    Log.i("GPS"," Network"+lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER)); 
    Log.i("GPS"," Passive"+lm.isProviderEnabled(LocationManager.PASSIVE_PROVIDER)); 

    if ((!lm.isProviderEnabled(LocationManager.GPS_PROVIDER) 
      && !lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) 
      || isLocationNullSecondTime) { 
     Log.i("GPS", "Inside Constructor"); 

     Toast.makeText(mContext, "Turn on your Location provider", 
       Toast.LENGTH_LONG).show(); 
     Intent myIntent = new Intent(
       Settings.ACTION_LOCATION_SOURCE_SETTINGS); 
     mContext.startActivity(myIntent); 
    } 


} 

public boolean getLocation(LocationResult result) 
{ 
    Log.i("GEo fence","DataStore.IS_THREAD_RUNNING : "+DataStore.IS_THREAD_RUNNING); 
    if(!DataStore.IS_THREAD_RUNNING) { 


/*  if ((!lm.isProviderEnabled(LocationManager.GPS_PROVIDER) 
       && !lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) 
       || isLocationNullSecondTime) { 
      Log.i("GPS", "Inside Constructor"); 

      Toast.makeText(mContext, "Turn on your Location provider", 
        Toast.LENGTH_LONG).show(); 
      Intent myIntent = new Intent(
        Settings.ACTION_LOCATION_SOURCE_SETTINGS); 
      mContext.startActivity(myIntent); 
     }*/ 

    Log.i("GPS","inside getlocation"); 
    //I use LocationResult callback class to pass location value from MyLocation to user code. 
    locationResult=result; 
    //exceptions will be thrown if provider is not permitted. 
    try{gps_enabled=lm.isProviderEnabled(LocationManager.GPS_PROVIDER);}catch(Exception ex){} 
    try{network_enabled=lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER);}catch(Exception ex){} 

    //don't start listeners if no provider is enabled 
    if(!gps_enabled && !network_enabled){ 
     Log.i("GPS","nothing is enable"); 
     return false; 
    } 
    if(gps_enabled){ 
     Log.i("GPS","inside getlocation Gps is enabled"); 
     lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 5000, locationListenerGps); 
    } 
    if(network_enabled){ 
     Log.i("GPS","inside getlocation netwok is enable"); 
     lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,0, 5000, locationListenerNetwork); 
    }  
    r=new GetLastLocation(); 
    handler.postDelayed(r,20000); 
    return true; 
} 
else { 
    return false; 
}} 


LocationListener locationListenerGps = new LocationListener() { 
    public void onLocationChanged(Location location) { 
     DataStore.IS_THREAD_RUNNING=true; 
     Log.i("GPS","inside onLocationcahnged of gps"); 
     isLocationNullSecondTime=false; 
     lm.removeUpdates(this); 
     lm.removeUpdates(locationListenerNetwork); 
     handler.removeCallbacks(r); 
     locationResult.gotLocation(location); 

    } 
    public void onProviderDisabled(String provider) { Log.i("GPS","inside onProviderDisabled of gps");} 
    public void onProviderEnabled(String provider) { Log.i("GPS","inside onProviderEnabled of gps");} 
    public void onStatusChanged(String provider, int status, Bundle extras) {} 
}; 

LocationListener locationListenerNetwork = new LocationListener() { 
    public void onLocationChanged(Location location) { 
     DataStore.IS_THREAD_RUNNING=true; 
     Log.i("GPS","inside onLocationcahnged of Network"); 
     isLocationNullSecondTime=false; 
     lm.removeUpdates(this); 
     lm.removeUpdates(locationListenerGps); 
     handler.removeCallbacks(r); 
     locationResult.gotLocation(location); 

    } 
    public void onProviderDisabled(String provider) {Log.i("GPS","inside onProviderDisabled of Network");} 
    public void onProviderEnabled(String provider) {Log.i("GPS","inside onProviderEnabled of Network");} 
    public void onStatusChanged(String provider, int status, Bundle extras) {} 
}; 

class GetLastLocation implements Runnable { 
    @Override 
    public void run() { 
     DataStore.IS_THREAD_RUNNING=true; 
     Log.i("GPS","inside the thread run"); 
     lm.removeUpdates(locationListenerGps); 
     lm.removeUpdates(locationListenerNetwork); 

     Location net_loc=null, gps_loc=null; 
     if(gps_enabled){ 
      gps_loc=lm.getLastKnownLocation(LocationManager.GPS_PROVIDER); 
      Log.i("GPS","gps location object :"+gps_loc); 
     } 
     if(network_enabled){ 
      net_loc=lm.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 
      Log.i("GPS","neteork object :"+ net_loc); 
     } 
     //if there are both values use the latest one 
     if(gps_loc!=null && net_loc!=null){ 
      handler.removeCallbacks(r); 
      isLocationNullSecondTime=false; 
      Log.i("GPS","neteork object not null :"+ net_loc); 
      Log.i("GPS","GPS object not null :"+ gps_loc); 
      if(gps_loc.getTime()>net_loc.getTime()) 
       locationResult.gotLocation(gps_loc); 
      else 
       locationResult.gotLocation(net_loc); 
      return; 
     }else{ 
      handler.removeCallbacks(r); 
      if(gps_loc!=null){ 
       isLocationNullSecondTime=false; 
       locationResult.gotLocation(gps_loc); 
       return; 
      } 
      else if(net_loc!=null){ 
       isLocationNullSecondTime=false; 
       locationResult.gotLocation(net_loc); 
       return; 
      } 
      else{ 
       isLocationNullSecondTime=true; 
       Log.i("GPS","Both the object is null and asking for turn on the Location provider :"); 
       locationResult.gotLocation(null); 
       return; 
      } 
     } 



     //locationResult.gotLocation(null); 
    } 
} 

public static abstract class LocationResult{ 
    public abstract void gotLocation(Location location); 
} 

puis dans votre activité écrire le code ou implémenter la méthode gotLocation (emplacement d'emplacement) comme ceci:

public LocationResult locationResult = new LocationResult() { 

    @Override 
    public void gotLocation(final Location location) { 
     // do something 
     mLocation = location; 
     if (geoFence.handler != null) { 
      geoFence.handler.removeCallbacks(geoFence.r); 
     } 
     if (location == null) { 
      if (DataStore.IS_THREAD_RUNNING) { 
       DataStore.IS_THREAD_RUNNING=false; 
      } 
      if (!lm.isProviderEnabled(LocationManager.GPS_PROVIDER)) { 
       createAlert("Turn on ur GPS provider", new int[] { 
         R.string.yes, R.string.no },2); 
       return; 
      } 
      if (!lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) { 
       createAlert("Turn on ur Network provider", new int[] { 
         R.string.yes, R.string.no },2); 
       return; 
      } 
      Toast.makeText(PreHomeScreen.this, 
        "Turn on your both Location provider and try again ", 
        Toast.LENGTH_LONG).show(); 

     } else { 
//////////////////////////////////Do ur work///////////////////////////////////// 

}

} 
}; 
0

Mon blog contient un exemple de code sur la façon de créer une étoile t les services de localisation et attendez un emplacement dans un thread de travail. Vous pouvez commencer à rechercher un emplacement au démarrage de l'application, mais continuer à l'exécuter pendant qu'il attend en arrière-plan. L'utilisateur peut avoir besoin de faire quelque chose avant que l'emplacement ne soit requis et, à ce moment, les services de localisation peuvent renvoyer un emplacement utilisable.

http://www.scotthelme.co.uk/blog/android-location-services/

Questions connexes