当前位置: 首页 > 知识库问答 >
问题:

如何在我的位置跟踪应用程序中移动GPS距离?Android、java

谢鸿飞
2023-03-14

所以我让全球定位系统从我“按下播放”开始持续跟踪和记录我的位置。我想显示所行驶的距离、平均速度、所花费时间的上升和下降。

我正在用我的“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]

共有2个答案

逑景铄
2023-03-14

您可以检查任何可用于地理定位的包。

郭兴文
2023-03-14

您可以将数据存储在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实际上不起作用: 为什么没用?以及如何使其正确工作?