作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个 Android 应用程序,我需要用户在其中模拟他们的当前位置。下面是我使用的代码,让用户按下绿色按钮开始模拟他们的位置。
当按下“绿色按钮”时,下面的代码开始伪造位置。
greenButton.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view) {
LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
lm.addTestProvider(LocationManager.GPS_PROVIDER,
"requiresNetwork" == "",
"requiresSatellite" == "",
"requiresCell" == "",
"hasMonetaryCost" == "",
"supportsAltitude" == "",
"supportsSpeed" == "",
"supportsBearing" == "",
Criteria.POWER_LOW,
Criteria.ACCURACY_FINE);
Location newLocation = new Location(LocationManager.GPS_PROVIDER);
newLocation.setLatitude(fakeLocation.getLatitude());
newLocation.setLongitude(fakeLocation.getLongitude());
newLocation.setAccuracy(fakeLocation.getAccuracy());
newLocation.setTime(System.currentTimeMillis());
newLocation.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos());
lm.setTestProviderEnabled(LocationManager.GPS_PROVIDER, true);
lm.setTestProviderStatus(LocationManager.GPS_PROVIDER,
LocationProvider.AVAILABLE,
null, System.currentTimeMillis());
lm.setTestProviderLocation(LocationManager.GPS_PROVIDER, newLocation);
}
});
当我在 map 上放置一个标记并按下绿色按钮时。位置模拟开始。那个“假位置”成为我当前的位置。
但是大约 10-20 秒后,模拟就结束了。我的“真实位置”成为我当前的位置。我在网上看到了很多示例,它们使用的代码与我用来模拟位置的代码相同。我不知道为什么我的应用程序会发生这种情况。任何帮助将不胜感激。
最佳答案
首先,位置请求会影响您为适当的位置提供者模拟的位置。
如果您为 GPS 提供者创建并设置模拟位置,然后再次向 GPS 提供者发出位置请求,则模拟将一直存在,直到 GPS 硬件接收到新位置。这可能需要 10-20 秒或更长时间(但大约 10-20 秒后,模拟就结束了...)
而且这个问题也是一些虚假位置应用程序问题的答案。您会看到诸如“使用此应用程序后我无法获取我当前的真实位置!!!”之类的评论。在市场上。因为他们需要像您一样发出位置请求。
最后,请在服务中循环模拟操作。我建议在后台线程上执行此操作,可能每 1 或 2 秒执行一次。通过这种方式,您可以减少其他应用程序可能的位置请求的影响。
Handler mHandler;
private void loopMocking(){
mHandler.post(mMockRunnable);
}
private Runnable mMockRunnable = new Runnable() {
@Override
public void run() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
newLocation.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos());
}
newLocation.setTime(System.currentTimeMillis());
lm.setTestProviderLocation(LocationManager.GPS_PROVIDER, newLocation);
mHandler.postDelayed(mMockRunnable, 1000); // At each 1 second
}
};
关于Android:模拟位置几秒钟后变回原始位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41201528/
COW 不是奶牛,是 Copy-On-Write 的缩写,这是一种是复制但也不完全是复制的技术。 一般来说复制就是创建出完全相同的两份,两份是独立的: 但是,有的时候复制这件事没多大必要
我是一名优秀的程序员,十分优秀!