如何在回调方法的每个时间间隔将经纬度数据添加到 Firebase 数据库

How to add lat long data to Firebase database every interval of callback method

我正在创建一个使用前台服务获取位置数据的路线跟踪应用程序。我有会话,对于每个会话,我都想要一个经度和纬度坐标列表。我目前只能存储一个坐标实例,它会更新每个回调间隔,而不是完全创建一个新集合。目的是有一个纬度和经度坐标列表,从中生成路线的多段线。

服务中的回调方法class:

 // Location callback every
    private final LocationCallback locationCallback = new LocationCallback() {
        @Override
        public void onLocationResult(LocationResult locationResult) {
            super.onLocationResult(locationResult);
            // If both locationResult and last location are not null then...
            // This avoids null pointer exceptions as there are instances where last known location
            // will be null

            if(locationResult != null && locationResult.getLastLocation() != null){
                location = locationResult.getLastLocation();
                // Parse the location to the sendBroadcastMessage method to send data
                // to receiver in RecordFragment classZ
                sendBroadcastMessage(location);
            }

            }
        };

广播方法:


    // Method to send data service to receiver in the RecordFragment class
    // Location is parsed to the method
    private void sendBroadcastMessage(Location location) {
        if (location != null) {
            Intent intent = new Intent(ACTION_LOCATION_BROADCAST);
            // Add extra data to the intent
            // When the intent is parsed so is the extra data
            intent.putExtra(EXTRA_LATITUDE, location.getLatitude());
            intent.putExtra(EXTRA_LONGITUDE, location.getLongitude());
            intent.putExtra(EXTRA_SPEED, location.getSpeed());
            intent.putExtra(EXTRA_BEARING, location.getBearing());
            // Send the data to receiver
            LocalBroadcastManager.getInstance(LocationService.this).sendBroadcast(intent);
        }
    }

广播接收者:

  /*
        The data sent from the service is handled below
         */
        LocalBroadcastManager.getInstance(getActivity()).registerReceiver(
                new BroadcastReceiver() {
                    @SuppressLint({"SetTextI18n", "DefaultLocale"})
                    @Override
                    public void onReceive(Context context, Intent intent) {

                        // Received data is now assigned to variables
                        double latitude = intent.getDoubleExtra(LocationService.EXTRA_LATITUDE, 0);
                        double longitude = intent.getDoubleExtra(LocationService.EXTRA_LONGITUDE, 0);
                        float speed = intent.getFloatExtra(LocationService.EXTRA_SPEED, 0);
                        float bearing = intent.getFloatExtra(LocationService.EXTRA_BEARING, 0);


                        // Stopwatch timer is retrieved
                        time = watch.getTime();

                        // Calculate the conversion from m/s to knots
                        // assign calculated value to variable
                        speedInKnots = speed * 1.194;
                        // Cast the float to double
                        doubleBearing = (((double) bearing));
                        // Calculate conversion from milli-seconds to seconds
                        // assign calculated value to variable
                        timeInSeconds = time / 1000;

                        // Log the location data
                        Log.d(TAG, "onReceive:  Lat: " + latitude + ", Long: " + longitude);
                        Log.d("Speed_before_conversion", "onReceive: Speed before conversion " + speed);

                        // Update the text views displayed in record fragment
                        // round() method called, double value parsed to it and the number of
                        // decimal places after the value
                        mCurrent_speedTv.setText("Speed is: " + round(speedInKnots, 2) + " knots");
                        mBearingTv.setText("Direction: " + round(doubleBearing, 2) + "\u00B0");
                        mElapsedTimeTv.setText("Elapsed time: " + round(timeInSeconds, 2) + " s");





                        FirebaseUser user = mAuth.getCurrentUser();
                        String uid = user.getUid();
                        Log.d(TAG, "Current user uid: " + uid);

                            // Put info into HashMap
                            latLongStoreServer.put("longitude", longitude);
                            latLongStoreServer.put("latitude", latitude);

                            FirebaseDatabase database = FirebaseDatabase.getInstance();
                            // Path toe store user data named "Users"
                            DatabaseReference reference = database.getReference("Users/" + uid);
                            // Put data within HashMap in database
                            reference.child("Sessions").child(sessionID).setValue(latLongStoreServer);




                    }
                }, new IntentFilter(LocationService.ACTION_LOCATION_BROADCAST)
        );
        return view;
    }

Firebase 数据库视图:

提前致谢。

非常简单的修复。使用 arraylist 而不是 HashMap。我已经实施了以下更改。

 ArrayList<Double> latLong = new ArrayList<>(); // Create an ArrayList object
  LocalBroadcastManager.getInstance(getActivity()).registerReceiver(
                new BroadcastReceiver() {
                    @SuppressLint({"SetTextI18n", "DefaultLocale"})
                    @Override
                    public void onReceive(Context context, Intent intent) {


                        // Received data is now assigned to variables
                        double latitude = intent.getDoubleExtra(LocationService.EXTRA_LATITUDE, 0);
                        double longitude = intent.getDoubleExtra(LocationService.EXTRA_LONGITUDE, 0);
                        float speed = intent.getFloatExtra(LocationService.EXTRA_SPEED, 0);
                        float bearing = intent.getFloatExtra(LocationService.EXTRA_BEARING, 0);


                        // Stopwatch timer is retrieved
                        time = watch.getTime();

                        // Calculate the conversion from m/s to knots
                        // assign calculated value to variable
                        speedInKnots = speed * 1.194;
                        // Cast the float to double
                        doubleBearing = (((double) bearing));
                        // Calculate conversion from milli-seconds to seconds
                        // assign calculated value to variable
                        timeInSeconds = time / 1000;

                        // Log the location data
                        Log.d(TAG, "onReceive:  Lat: " + latitude + ", Long: " + longitude);
                        Log.d("Speed_before_conversion", "onReceive: Speed before conversion " + speed);

                        // Update the text views displayed in record fragment
                        // round() method called, double value parsed to it and the number of
                        // decimal places after the value
                        mCurrent_speedTv.setText("Speed is: " + round(speedInKnots, 2) + " knots");
                        mBearingTv.setText("Direction: " + round(doubleBearing, 2) + "\u00B0");
                        mElapsedTimeTv.setText("Elapsed time: " + round(timeInSeconds, 2) + " s");




                        FirebaseUser user = mAuth.getCurrentUser();

                        String uid = user.getUid();
                        Log.d(TAG, "Current user uid: " + uid);

                            latLong.add(longitude);
                            latLong.add(latitude);

                            FirebaseDatabase database = FirebaseDatabase.getInstance();
                            // Path toe store user data named "Users"
                            DatabaseReference reference = database.getReference("Users/" + uid);
                            // Put data within HashMap in database
                            reference.child("Sessions").child(sessionID).setValue(latLong);




                    }
                }, new IntentFilter(LocationService.ACTION_LOCATION_BROADCAST)
        );
        return view;
    }