android: как исправить gps с фиктивными (фейковыми) координатами? - PullRequest
4 голосов
/ 08 ноября 2011

Я пытаюсь исправить GPS программно, когда сигнал GPS недоступен.Я хочу сделать это, чтобы предоставить фиктивные координаты другим приложениям, таким как карты Google и другие.Я пытался использовать GPS_PROVIDER и NETWORK_PROVIDER, но только с последним я могу получить новое местоположение, действительное для карт Google.Но это работает только в первом времени, и если я хочу исправить больше ложных мест, Google Maps не видит никаких изменений ... почему ??Я должен сделать сервис для того, что я хочу сделать?

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);   

}

и слушатель местоположения

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) {
}

}

спасибо

1 Ответ

18 голосов
/ 08 ноября 2011

Какие фиктивные местоположения нужны:

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

Также в настройках телефона Android установите флажок «Разрешить фиктивные местоположения»

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

.Теперь, когда вы хотите отправить местоположение, позвоните по этому коду:

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); 

.

Но это работает только в первый раз

Потому что выназвал это один раз.

Мне нужно сделать сервис для того, что я хочу сделать

Вы можете сделать это, даже AsyncTask сделает

doэто или нет: lm.requestLocationUpdates ()

Да, вы должны с mocLocationProvider

Я уже несколько раз вызываю метод setLocation (широта, долгота), ноэто работает (обновление местоположения) только в первый раз для карт Google

Нет метода с именем setLocation(), используйте setTestLocation()

Чтона самом деле я должен сделать в asynckTask

Вы можете использовать Thread, TimerTask или все что угодно.Идея состоит в том, чтобы вводить местоположение каждую секунду в Framework.

...