android:如何用mock(假)坐标修复gps?

ade*_*dev 4 gps android location locationmanager

当GPS信号不可用时,我正在尝试以编程方式修复GPS.我想这样做是为了向谷歌地图和其他应用程序等其他应用程序提供模拟坐标.我尝试使用GPS_PROVIDER和NETWORK_PROVIDER,但只有后者才能获得一个适用于谷歌地图的新位置.但这只适用于第一个tima,如果我想重新修复更多的模拟位置谷歌地图没有看到任何变化......为什么?我必须为我想做的事做一个服务?

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

}
Run Code Online (Sandbox Code Playgroud)

和位置监听器

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

}
Run Code Online (Sandbox Code Playgroud)

谢谢

Ren*_*eno 18

模拟地点需要什么:

<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION">
Run Code Online (Sandbox Code Playgroud)

同样在Android手机设置中,请确保勾选"允许模拟位置"复选框

locationManager.addTestProvider(mocLocationProvider, false, false,
                    false, false, true, true, true, 0, 5);
locationManager.setTestProviderEnabled(mocLocationProvider, true);
Run Code Online (Sandbox Code Playgroud)

.现在,只要您想发送位置,请调用以下代码:

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); 
Run Code Online (Sandbox Code Playgroud)

.

但这只是第一次有效

因为你打了一次电话.

我必须为我想做的事做一个服务

你可以做到这一点,甚至是AsyncTask也能做到的

这样做与否:lm.requestLocationUpdates()

是的,你必须与 mocLocationProvider

我已经调用了更多次方法setLocation(纬度,经度),但它仅适用于谷歌地图的第一次工作(位置更新)

没有方法叫做setLocation(),使用setTestLocation()

我真的需要在asynckTask中做什么

您可以使用Thread,TimerTask或任何您喜欢的东西.我们的想法是每隔一秒将位置注入框架.