Android LocationListener调用不一致
我正在尝试在android中创建我自己的位置提供者,以便在系统中注入我自己的定位数据。为此,我在系统中重用LocationManager函数,在那里注册一个我希望调用的侦听器,但并不总是调用它。我做了一些研究,但我无法找出系统用来触发事件的模式,而且谷歌也没有大量的官方文档 请注意,我没有使用系统中的任何位置提供商(GPS、网络…)。我创建自己的坐标和时间戳,并将其发布在假位置提供者中,因此几乎所有关于此问题的问题都与此问题略有不同(因此与GPS无关,无论我是否移动,最小距离参数…) 这里我向您展示生成的代码和日志。您可以很容易地看到,某些事件从未被触发(如onProvider启用)、在不应该触发时被触发(onProviderDisbled)或在错误的时间被触发(如onStatusChanged,只有在状态更改和位置更改后才会触发) 以下是主要代码:Android LocationListener调用不一致,android,gps,location,Android,Gps,Location,我正在尝试在android中创建我自己的位置提供者,以便在系统中注入我自己的定位数据。为此,我在系统中重用LocationManager函数,在那里注册一个我希望调用的侦听器,但并不总是调用它。我做了一些研究,但我无法找出系统用来触发事件的模式,而且谷歌也没有大量的官方文档 请注意,我没有使用系统中的任何位置提供商(GPS、网络…)。我创建自己的坐标和时间戳,并将其发布在假位置提供者中,因此几乎所有关于此问题的问题都与此问题略有不同(因此与GPS无关,无论我是否移动,最小距离参数…) 这里我向您
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lm = (LocationManager) getSystemService(Service.LOCATION_SERVICE);
if (!isMockLocationSet()) {
throw new RuntimeException("Mock Locations are disabled!");
}
// 1. Generate a valid random name for the mock provider
providerName = this.generateValidProviderName();
// 2. Create the mock provider
System.out.println("Step 2: Create provider (" + providerName + ")");
try {
if (lm.getProvider(providerName) == null) {
throw new IllegalArgumentException();
}
} catch (IllegalArgumentException e) {// Doesn't exist, create
lm.addTestProvider(providerName, false, false, false, false, false,
false, false, Criteria.POWER_MEDIUM, Criteria.ACCURACY_HIGH);
}
// 3. Register for updates
System.out.println("Step 3: Register for updates");
MyLocationListener l = new MyLocationListener();
lm.requestLocationUpdates(providerName, 0, 0, l);
MyAsyncTask task = new MyAsyncTask();
task.execute();
}
private class MyAsyncTask extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
Location loc = new Location(providerName);
// 4. Enable it!
System.out.println("Step 4: Enable it");
lm.setTestProviderEnabled(providerName, true);
// 5. Change the status
System.out.println("Step 5: Change the status to AVAILABLE");
lm.setTestProviderStatus(providerName, LocationProvider.AVAILABLE,
null, System.currentTimeMillis());
// 6. Change the status
System.out
.println("Step 7: Change the status to TEMPORARILY_UNAVAILABLE");
lm.setTestProviderStatus(providerName,
LocationProvider.TEMPORARILY_UNAVAILABLE, null,
System.currentTimeMillis());
// 7.1. Change location
System.out.println("Step 7.1: Change Location");
loc.setTime(System.currentTimeMillis());
loc.setLatitude(52.0f);
loc.setLongitude(10.0f);
lm.setTestProviderLocation(providerName, loc);
// 7.2. Change location
System.out.println("Step 7.2: Change Location");
loc.setTime(System.currentTimeMillis());
loc.setLatitude(52.1f);
loc.setLongitude(10.1f);
lm.setTestProviderLocation(providerName, loc);
// 7.3. Change the status
System.out.println("Step 7.3: Change the status to AVAILABLE");
lm.setTestProviderStatus(providerName, LocationProvider.AVAILABLE,
null, System.currentTimeMillis());
// 7.4. Change location
System.out.println("Step 7.4: Change Location");
loc.setTime(System.currentTimeMillis());
loc.setLatitude(52.2f);
loc.setLongitude(10.2f);
lm.setTestProviderLocation(providerName, loc);
// 7.5. Change the status
System.out.println("Step 7.5: Change the status to OUT_OF_SERVICE");
lm.setTestProviderStatus(providerName,
LocationProvider.OUT_OF_SERVICE, null,
System.currentTimeMillis());
// 7.6. Change location
System.out.println("Step 7.6: Change Location");
loc.setTime(System.currentTimeMillis());
loc.setLatitude(52.3f);
loc.setLongitude(10.3f);
lm.setTestProviderLocation(providerName, loc);
try {
// 8. Delete provider
System.out.println("8. Delete provider");
lm.setTestProviderEnabled(providerName, false);
lm.removeTestProvider(providerName);
} catch (IllegalArgumentException e) {
}
return null;
}
}
当然,这不是许可问题:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
我花了很多时间研究这个问题,并将代码简化为最小的表达式,所以我希望您至少可以看一看
谢谢
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />