感谢CommsWare。由于评论区的空间限制,我用这种方式来回应。
用户应该为他们将要提取的物品拍照并将其发送到服务器。完成此操作后,服务器会发回一个轮询周期,以便电话定期发送其位置。我已经设置了 textViews
显示获得的纬度/经度(见下文),但这部分直到两晚前才起作用。在我稍微耐心一点之后,它终于奏效了,让电话慢慢地获得一个位置。我认为当时的问题是我不允许手机进行定位,所以它不起作用。现在问题仍然存在,定期更新可能不起作用,根据你所说的,并且基于我在完全晴朗的天空下站在外面大约 2 分钟才得到位置修复的事实。
这是一些代码的快照(这部分在主要活动的 onCreate 覆盖中以获取第一个位置修复):
`LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0,
0, new LocationListener() {
public void onStatusChanged(String provider, int status,
Bundle extras) {
// called when the provider status changes. Possible
// status: OUT_OF_SERVICE, TEMPORARILY_UNAVAILABLE or
// AVAILABLE.
}
public void onProviderEnabled(String provider) {
// called when the provider is enabled by the user
}
public void onProviderDisabled(String provider) {
// called when the provider is disabled by the user, if
// it's already disabled, it's called immediately after
// requestLocationUpdates
}
public void onLocationChanged(Location location) {
double latitute = location.getLatitude();
double longitude = location.getLongitude();
tv5.setText(""+latitute);
tv6.setText(""+longitude);
}
});
`
下面是 SOAP 请求和响应处理机制的一部分。
`//以秒为单位获取轮询周期。字符串[] getPollNumber; getPollNumber = resultParams[2].split(";");
//Set up the intent to be passed to the tracking service.
Intent updateLocation = new Intent (this,TrackUser.class);
PendingIntent pendingIntent = PendingIntent.getService(PickUp.this, 0, updateLocation, 0);
//Set up the alarm manager to be used to periodically send updates.
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
//If instruction = 1, start tracking the user.
if(instruction == 1)
{
//Start tracking service on phone.
pollPeriod = Integer.parseInt(getPollNumber[0]);
alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (pollPeriod*1000), pollPeriod*1000, pendingIntent);
}
else
{
if(instruction == 0)
{
//Stop tracking service.
stopService(new Intent(this,TrackUser.class));
alarmManager.cancel(pendingIntent);
}
}
'
在跟踪服务类中,我使用从其 onStart() 覆盖调用的方法,该方法简单地将当前坐标打包到 SOAP 对象中并更新服务器。我担心如果手机像你说的那样进入睡眠状态,GPS 可能没有足够的时间在这些更新期间锁定。我想知道当服务启动时我是否应该有某种计时器(可能是 requestLocationUpdates 的 minTime 设置?)让手机保持唤醒状态约 3 分钟,以便可以进行修复?请让我知道这些代码片段是否有帮助,以及更新位置的想法是否可行,谢谢。