2011-11-07 54 views
4

我正試圖通過編程方式解決GPS信號不可用時的問題。我想這樣做是爲了向其他應用程序提供模擬座標,例如谷歌地圖和其他應用程序。我試圖使用GPS_PROVIDER和NETWORK_PROVIDER,但只有後者我可以得到一個有效的谷歌地圖的新位置。但是,這隻適用於第一次提馬,如果我想重新修復更多的模擬位置谷歌地圖沒有看到任何改變......爲什麼? 我必須爲我想做的事情做一個服務?android:如何使用模擬(假)座標來修復GPS?

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

} 

感謝

+0

你有解決這個問題嗎?我也可以只設置一次模擬位置。 –

回答

18

模擬地點需要什麼:

<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做

這樣做或不:lm.requestLocationUpdates()

是的,你必須與mocLocationProvider

我已經呼籲多次的方法setLocation(緯度,經度),但它的工作原理(位置updateding)只是第一次谷歌地圖

沒有叫setLocation()方法,使用setTestLocation()

實際上我需要做什麼在asynck任務

你可以使用一個線程,一個TimerTask或任何你喜歡的東西。這個想法是每秒鐘都在框架中注入位置。

+0

謝謝里諾, – adev

+1

我們在StackOverflow上表示感謝,並用綠色標記標記解決方案。別客氣。 – Reno

+0

我設置了正確的權限。還有兩個疑問:1)我不需要爲LocationListner綁定LocationManager嗎?2)爲什麼如果我嘗試手動調用setLocation(所以我多次調用LocationManager),它不起作用,我必須使用asynktask?我必須在asynctask中打電話嗎?謝謝你 – adev