所以我让全球定位系统从我“按下播放”开始持续跟踪和记录我的位置。我想显示所行驶的距离、平均速度、所花费时间的上升和下降。
我正在用我的“LocationsService.java”类记录我的位置,这个类使用startLocationService(),它通过LocationCallback循环(我想)。我使用从@TDIScott获得的代码创建了一个hashmap,并将其放入列表中。
public List<Map<Long, Location>> locationHistory = new ArrayList<>();
private LocationCallback locationCallback = new LocationCallback(){
@Override
public void onLocationResult(LocationResult locationResult) {
super.onLocationResult(locationResult);
if(locationResult != null && locationResult.getLastLocation() != null){
double latitude = locationResult.getLastLocation().getLatitude();
double longitude = locationResult.getLastLocation().getLongitude();
int altitude = (int) locationResult.getLastLocation().getAltitude();
double speed = locationResult.getLastLocation().getSpeed();
Log.d("LOCATION_UPDATE", latitude + ", " + longitude + ", " + altitude + ", " + speed + ", " + System.currentTimeMillis() + ", " + locationResult.getLastLocation());
Map<Long, Location> temp = new HashMap<>();
temp.put(System.currentTimeMillis(), locationResult.getLastLocation());
locationHistory.add(temp);
}
}
};
private void startLocationService() {
String channelId = "location_notification_channel";
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
Intent resultIntent = new Intent();
PendingIntent pendingIntent = PendingIntent.getActivity(
getApplicationContext(),
0,
resultIntent,
PendingIntent.FLAG_UPDATE_CURRENT
);
NotificationCompat.Builder builder = new NotificationCompat.Builder(
getApplicationContext(),
channelId
);
builder.setSmallIcon(R.mipmap.ic_launcher);
builder.setContentTitle("iAthletics is recording"); //Endre til iAthletics is recording
builder.setDefaults(NotificationCompat.DEFAULT_ALL);
builder.setContentText("Running");
builder.setContentIntent(pendingIntent);
builder.setAutoCancel(false);
builder.setPriority(NotificationCompat.PRIORITY_MAX);
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
if (notificationManager != null && notificationManager.getNotificationChannel(channelId) == null) {
NotificationChannel notificationChannel = new NotificationChannel(channelId, "Location Service", NotificationManager.IMPORTANCE_HIGH);
notificationChannel.setDescription("This channel is used by location service");
notificationManager.createNotificationChannel(notificationChannel);
}
}
LocationRequest locationRequest = new LocationRequest();
locationRequest.setInterval(1000);
locationRequest.setFastestInterval(500);
locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
LocationServices.getFusedLocationProviderClient(this).requestLocationUpdates(locationRequest, locationCallback, Looper.getMainLooper()); //TODO Husk eventuell permission check hvis det ikke funker
startForeground(Constants.LOCATION_SERVICE_ID, builder.build());
}
更新问题:如何访问在“LocationSevice.java”类中创建的列表中的位置对象,并计算平均速度、距离、上升和下降?从活动类。
PS:我已经尝试了TDIScott提供的第二个代码,但它不起作用。
如果需要,以下是location对象如何存储在日志中,并且可能存储在列表中:
位置[保险丝59896346,10621862 hAcc=31 et=4d21h21m52s480ms alt=65.79999542236328 vel=0.10678082 bear=100.58679 vAcc=11 sAcc=???bAcc=??{Bundle[mParcelledData.dataSize=52]
您可以检查任何可用于地理定位的包。
您可以将数据存储在LocationResult列表中,以便更详细地说出两次之间的距离,或者只是在进行时将它们相加。
存储:
List<Map<Long,LocationResult> locationHistory = new ArrayList();
private LocationCallback locationCallback = new LocationCallback(){
@Override
public void onLocationResult(LocationResult locationResult) {
super.onLocationResult(locationResult);
if(locationResult != null && locationResult.getLastLocation() != null){
double latitude = locationResult.getLastLocation().getLatitude();
double longitude = locationResult.getLastLocation().getLongitude();
int altitude = (int) locationResult.getLastLocation().getAltitude();
Log.d("LOCATION_UPDATE", latitude + ", " + longitude + ", " + altitude);
Map<Long, LocationResult> temp = new HashMap<>();
temp.put(System.currentTimeMillis(), locationResult);
locationHistory.add(temp);
}
}
};
有了以上内容,您现在有了一个以毫秒为单位的时间键和一个LocationResult值。
您可以通过
Map<Long, LocationResult> locationHistory = new HashMap<>();
LocationResult temp = null;
float distance = 0;
for (Map.Entry<Long, LocationResult> entry : locationHistory.entrySet()) {
if(temp != null){
distance += temp.distanceTo(entry.getValue());
temp = entry.getValue();
}
}
textView.setText(String.valueOf(distance));
现在您有了LocationResult,将它们相加并执行您需要的操作。就是计算距离、海拔上升和下降等。
我想做一个跑步应用程序,跟踪用户的位置、速度和跑步距离。目前,我正在使用谷歌定位服务API获取GPS数据,因为谷歌在官方网站上推荐它。 但问题是,我只能每10秒更新一次位置,如果只是在地图上绘制位置,这是可以的,但我想计算用户当前速度(公里/小时)、当前速度(分钟/米),并计算他跑一圈(1公里或1英里)的确切时间。问题是,如果我每10秒收到一次更新,我无法准确计算这些参数。例如,更新是在用户996
我正在为中国开发一个需要GPS位置跟踪的android应用程序。对于位置跟踪,android需要访问Google play服务。但Google play服务在中国被屏蔽。 这个问题有解决办法吗?有没有推荐的第三方库或实现? 谢谢
它显示了方向,而用户将移动与位置在android应用程序,但没有来源找到和我是新的这个主题,请给我一些建议或提示,这一任务,如何在应用程序中使用
有很多类似的帖子存在,但没有一个包含doze模式,与alarmmanager和短期定期更新有问题。 目标:在GPS的帮助下,接收定期中断以更新位置 null null 问题: alarmmanager不再可靠,因为Doze的功能。当设备处于Hibernate状态时,不发送alarmmanager。 当屏幕关闭时,我无法从gps接收位置更新 有关此问题的其他信息: null 我需要哪些组件来实现这一
如果我们使用此代码,我们会看到一条消息:搜索GPS。然而,仅示出了GPS符号;GPS实际上不起作用: 为什么没用?以及如何使其正确工作?