Gui*_*osa 5 java gps android android-studio
我在尝试使用 Android 模拟位置时遇到问题,我的主要目标是将 Android GPS 设置为认为我们处于不同的位置,又名假 GPS。
我目前尝试了两种不同的类似解决方案,可在这两个网站上找到:
这两个教程都是 2012 年的,我不知道它们是否已经过时,或者我很难实施它们。
首先我确保我有权限:
注意:1 和 2 都被检查,如果它们不可用,我使用requestPermissions函数请求许可。第三个是无法询问的,实际上只能在调试模式下通过AndroidManifest.xml添加。
我还确保在“设置”>“开发人员选项”>“允许模拟位置”中选择了我的应用程序。
毕竟,我已经尝试通过 OnCreate 方法或 OnClick 按钮调用这个函数:
public void mockLocation(){
LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
Criteria criteria = new Criteria();
criteria.setAccuracy( Criteria.ACCURACY_FINE );
String mocLocationProvider = lm.getBestProvider( criteria, true );
if ( mocLocationProvider == null ) {
Toast.makeText(getApplicationContext(), "No location provider found!", Toast.LENGTH_SHORT).show();
return;
}
lm.addTestProvider(mocLocationProvider, false, false,
false, false, true, true, true, 0, 5);
lm.setTestProviderEnabled(mocLocationProvider, true);
Location loc = new Location(mocLocationProvider);
Location mockLocation = new Location(mocLocationProvider); // a string
mockLocation.setLatitude(-26.902038); // double
mockLocation.setLongitude(-48.671337);
mockLocation.setAltitude(loc.getAltitude());
mockLocation.setTime(System.currentTimeMillis());
lm.setTestProviderLocation( mocLocationProvider, mockLocation);
Toast.makeText(getApplicationContext(), "Working", Toast.LENGTH_SHORT).show();
}
Run Code Online (Sandbox Code Playgroud)
如果我以这种方式编译和测试,我将收到Toast:“找不到位置提供程序!” 。但如果我将 mocLocationProvider 更改为:
String mocLocationProvider = LocationManager.NETWORK_PROVIDER;
Run Code Online (Sandbox Code Playgroud)
我遇到 APP 崩溃的情况,在 LogCat 中它说在这一行期间崩溃了:
lm.setTestProviderLocation(mocLocationProvider, mockLocation);
Run Code Online (Sandbox Code Playgroud)
所以我目前没有选择,也不知道如何前进。
您必须设置准确度和 ElapsedRealtimeNanos 值
location.setAccuracy(...);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
location.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos());
}
Run Code Online (Sandbox Code Playgroud)
否则它会抛出 IllegalArgumentException。
如果位置不完整,则@抛出 IllegalArgumentException
更新
如果你嘲笑网络提供商
String mocLocationProvider = LocationManager.NETWORK_PROVIDER;
Run Code Online (Sandbox Code Playgroud)
然后您将通过网络提供商收到模拟位置,
LocationListener listener = new LocationListener(){
...
void onLocationChanged(Location location){
}
};
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, ..., listener);
Run Code Online (Sandbox Code Playgroud)
并且每当您调用 setTestProviderLocation 方法时,都会触发 onLocationChanged 回调!
| 归档时间: |
|
| 查看次数: |
21610 次 |
| 最近记录: |