2016-03-30 1 views
0

J'ai un service qui doit obtenir l'emplacement de l'utilisateur quand il se déplace. Je n'ai pas été capable de comprendre comment mettre onLocationChanged dans onStart, donc je l'ai juste mis dehors. Sera-t-il encore appelé lorsque l'utilisateur se déplace? Si non, comment pourrais-je l'appeler dans onStart?Est-ce que onLocationChanged sera toujours appelé même s'il ne se trouve pas dans le OnStart du Service?

public class myService extends Service implements LocationListener { 
Double lat; 
Double lng; 

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

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
// Let it continue running until it is stopped. 
Toast.makeText(this, "Service Started", Toast.LENGTH_LONG).show(); 





return START_STICKY; 

} 

@Override 
public void onDestroy() { 
super.onDestroy(); 
Toast.makeText(this, "Service Destroyed", Toast.LENGTH_LONG).show(); 

} 



@Override 
public void onLocationChanged(Location location) { 

if (MainActivity.location != null) { 


    lat = MainActivity.location.getLatitude(); 

    lng = MainActivity.location.getLongitude(); 


    if (MainActivity.placeArrayList.size() != 0) { 
     for (int i = 0; i < MainActivity.placeArrayList.size(); i++) { 


      Log.e("hello", String.valueOf(Float.parseFloat(MainActivity.latitudeArrayList.get(i)))); 

      MainActivity.destination.setLatitude(Double.parseDouble(MainActivity.latitudeArrayList.get(i))); 
      MainActivity.destination.setLongitude(Double.parseDouble(MainActivity.longitudeArrayList.get(i))); 
      Log.e("distancemeters", String.valueOf(MainActivity.location.distanceTo(MainActivity.destination))); 

      if (MainActivity.location.distanceTo(MainActivity.destination)<100) { 




       AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); 

       audioManager.setStreamVolume(AudioManager.STREAM_RING, AudioManager.RINGER_MODE_SILENT, AudioManager.FLAG_SHOW_UI); 


      } else { 



      } 

     } 


    } 
} 

} 

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

} 

@Override 
public void onProviderEnabled(String provider) { 

} 

@Override 
public void onProviderDisabled(String provider) { 

} 
} 

Répondre

0

En supposant que vous utilisez Google FusedLocationProviderApi, vous devez faire deux choses d'abord:

  1. Modifier votre classe pour mettre en œuvre GoogleApiClient.ConnectionCallbacks et GoogleApiClient.OnConnectionFailedListener
  2. Créer votre objet GoogleApi
  3. Créer LieuDemander l'objet
  4. Enregistrez votre cours en tant que LocationListener

D'abord, changer votre définition de classe comme suit:

public class myService extends Service implements LocationListener,  
                GoogleApiClient.ConnectionCallbacks, 
                GoogleApiClient.OnConnectionFailedListener { 

Ensuite, mettre ceci dans votre méthode onStart():

// 2. Create the GoogleApi object 
GoogleApi = new GoogleApiClient.Builder(this) 
      .addConnectionCallbacks(this) 
      .addOnConnectionFailedListener(this) 
      .addApi(LocationServices.API) 
      .build(); 

// 3. Create the LocationRequest 
mLocationRequest.setInterval(1000); // in milliseconds 
mLocationRequest.setFastestInterval(1000); // in milliseconds 
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 

// 4. Register your listener 
LocationServices.FusedLocationApi.requestLocationUpdates(GoogleApi, mLocationRequest, this) 

Si vous voulez désenregistrer votre auditeur, mettre cela en onDestroy():

LocationServices.FusedLocationApi.removeLocationUpdates(GoogleApi, this); 

Cependant, gardez à l'esprit que l'utilisation de méthode signifie que vous obtiendrez une mise à jour de l'emplacement à des intervalles de temps spécifiés, pas lorsque l'utilisateur se déplace. Vous devrez trouver un moyen de suivre l'emplacement de l'utilisateur et de déterminer une distance minimale qui constitue un «mouvement». Aussi, vous devrez considérer que l'emplacement peut danser autour de l'emplacement de l'utilisateur, donc vous devrez également en tenir compte.

+0

Une petite chose, MainActivity.getAppContext() n'est pas reconnue. Il ne sait pas ce que getAppContext() est – felix

+0

Désolé - j'ai levé le code d'un de mes projets. Vous avez juste besoin de transmettre une référence à votre Service, c'est-à-dire 'ceci '. Edited ma réponse pour refléter cela. – nagyben