我正在使用Android Studio和Firebase创建一个实时的公共交通跟踪系统。我创建了一个切换按钮,用户可以打开该按钮,该位置将开始跟踪。
我面临的问题是位置数据仅发送一次到数据库。但是对于应用而言,位置可以正常跟踪。
我需要的是每次位置更新都必须更新到数据库中。这是我的代码中的错误还是错误?

这是位置回调函数:

        //Location Callback
        locationCallback = new LocationCallback(){
            @Override
            public void onLocationResult(LocationResult locationResult) {

                if(locationResult == null) {
                  return;
                }
                Location driverLocation = locationResult.getLastLocation();
                Toast.makeText(DriverDetail.this, driverLocation.getLatitude()+", "+driverLocation.getLongitude()
                        , Toast.LENGTH_SHORT).show();
                Log.d("Location Update: ", "onLocationResult: Location is: "
                        +driverLocation.getLatitude()+", "+driverLocation.getLongitude());
            }
        };



这是“切换”按钮的代码

locate_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View button) {
                if (locate_btn.isChecked()) {
                    // The toggle is enabled
                    Toast.makeText(DriverDetail.this, "Start tracking location", Toast.LENGTH_SHORT).show();

                    final String value_lat = String.valueOf(driverLocation.getLatitude());
                    final String value_lng = String.valueOf(driverLocation.getLongitude());

                    getLocationUpdates();

                    ref.child(firebaseUser.getUid()).child("Latitude").setValue(value_lat);
                    ref.child(firebaseUser.getUid()).child("Longitude").setValue(value_lng);

                }
                else {
                    // The toggle is disabled
                    fusedLocationProviderClient.removeLocationUpdates(locationCallback);
                    Toast.makeText(DriverDetail.this, "Stop tracking location", Toast.LENGTH_SHORT).show();
                }

            }
        });


这是我设置的位置请求。

//Update Location
    private void getLocationUpdates(){

        locationRequest = LocationRequest.create();
        locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        locationRequest.setInterval(5000);
        locationRequest.setFastestInterval(3000);

        fusedLocationProviderClient.requestLocationUpdates(locationRequest, locationCallback, Looper.getMainLooper());
        ValueEventListener valueEventListener = new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        };
    }

最佳答案

您的代码现在可以在用户切换按钮时将位置数据写入Firebase。

相反,您想要的是在切换按钮后连续写入位置。这意味着写入应该在onLocationResult内部进行(或从中触发):

locationCallback = new LocationCallback(){
    @Override
    public void onLocationResult(LocationResult locationResult) {

        if(locationResult == null) {
          return;
        }
        Location driverLocation = locationResult.getLastLocation();

        if (true) { // TODO: check if button is toggled
            final String value_lat = String.valueOf(driverLocation.getLatitude());
            final String value_lng = String.valueOf(driverLocation.getLongitude());

            ref.child(firebaseUser.getUid()).child("Latitude").setValue(value_lat);
            ref.child(firebaseUser.getUid()).child("Longitude").setValue(value_lng);
        }
    }
};


if (true)语句中,您可能要检查按钮是否已切换。但是由于我注意到您仅在用户切换按钮时才注册位置更新,因此甚至可能不需要检查。

08-17 17:47
查看更多