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 次  |  
        
|   最近记录:  |