2011-11-07 4 views
4

J'essaie de réparer le GPS par programmation lorsque le signal GPS n'est pas disponible. Je veux le faire afin de fournir des coordonnées fictives à d'autres applications comme google maps et autres. J'ai essayé d'utiliser GPS_PROVIDER et NETWORK_PROVIDER mais seulement avec ce dernier je peux obtenir un nouvel emplacement valide pour google maps. Mais cela fonctionne seulement le premier tima et si je veux re-fixer plus de lieux fictifs google maps ne voit aucun changement ... pourquoi? Je dois faire un service pour ce que je veux faire?android: comment réparer les gps avec des coordonnées fausses (faux)?

public void setLocation(double latitude, double longitude) { 


    //mocLocationProvider = LocationManager.GPS_PROVIDER; 
    mocLocationProvider = LocationManager.NETWORK_PROVIDER; 
    lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
    lm.clearTestProviderEnabled(mocLocationProvider); 
    lm.requestLocationUpdates(mocLocationProvider,0,0,new llistener()); 
    lm.addTestProvider(mocLocationProvider, false, false, false, false, false, false, false, 0, 10); 
    lm.setTestProviderEnabled(mocLocationProvider, true); 
    Location loc = new Location(mocLocationProvider); 
    loc.setTime(System.currentTimeMillis()); 
    loc.setLatitude(latitude); 
    loc.setLongitude(longitude); 
    loc.setAccuracy(10); 
    lm.setTestProviderStatus(mocLocationProvider, LocationProvider.AVAILABLE,null, System.currentTimeMillis()); 
    lm.setTestProviderLocation(mocLocationProvider, loc); 

} 

et l'emplacement auditeur

public class llistener implements LocationListener { 
@Override 
public void onLocationChanged(Location loc) { 
    // TODO Auto-generated method stub 
} 

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

@Override 
public void onProviderEnabled(String provider) { 
    // TODO Auto-generated method stub 
} 

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

} 

grâce

+0

avez-vous résolu ce problème? Je peux également définir l'emplacement simulé seulement une fois. –

Répondre

18

Quels endroits simulacres besoin:

<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"> 

également dans les paramètres du téléphone android assurez-vous que vous avez la "Autoriser les positions fictives" case à cocher cochée

locationManager.addTestProvider(mocLocationProvider, false, false, 
        false, false, true, true, true, 0, 5); 
locationManager.setTestProviderEnabled(mocLocationProvider, true); 

. Maintenant, chaque fois que vous voulez envoyer un emplacement, appelez ce code:

Location mockLocation = new Location(mocLocationProvider); // a string 
mockLocation.setLatitude(location.getLatitude()); // double 
mockLocation.setLongitude(location.getLongitude()); 
mockLocation.setAltitude(location.getAltitude()); 
mockLocation.setTime(System.currentTimeMillis()); 
locationManager.setTestProviderLocation(mocLocationProvider, mockLocation); 

.

Mais cela ne fonctionne que pour la première fois

Parce que vous l'avez appelé une fois.

Je dois faire un service pour ce que je veux faire

Vous pouvez le faire, même un AsyncTask fera

faire ceci ou pas: lm.requestLocationUpdates()

Oui, vous devez le mocLocationProvider

J'appelle déjà plusieurs fois la méthode setLocation (latitude, longitude), mais il fonctionne (emplacement updateding) ne première fois pour google maps

Il n'y a pas de méthode appelée setLocation(), utilisez setTestLocation()

Qu'est-ce que je dois faire dans asynckTask

Vous pouvez utiliser un Thread, un TimerTask ou tout ce que vous voulez. L'idée est d'injecter le lieu chaque seconde dans le cadre.

+0

merci Reno, – adev

+1

Nous disons merci StackOverflow par upvotes/marquage de la solution avec une coche verte. Vous êtes les bienvenus. – Reno

+0

Je définis les autorisations correctes. Juste deux autres doutes: 1) Je n'ai pas besoin de lier LocationManager sur LocationListner pour cela?2) Pourquoi exactement si j'essaie de rappeler setLocation manuellement (donc j'appelle LocationManager plus d'une fois) cela ne fonctionne pas et je dois utiliser la asynktask? Ce que je dois appeler asynctask? Merci beaucoup – adev

Questions connexes