【问题标题】:How to add lat long data to Firebase database every interval of callback method如何在每个回调方法间隔将经纬度数据添加到 Firebase 数据库
【发布时间】:2021-01-14 22:14:02
【问题描述】:

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

服务类中的回调方法:

 // 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 数据库视图:

提前致谢。

【问题讨论】:

    标签: android firebase latitude-longitude


    【解决方案1】:

    非常简单的修复。使用 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;
        }
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-19
      • 2017-01-08
      • 1970-01-01
      相关资源
      最近更新 更多