FusedLocationProviderClient: отправка точных координат GPS дважды (непериодически) - PullRequest
0 голосов
/ 13 октября 2019

В настоящее время я разрабатываю приложение, с помощью которого человек может отправить на сервер свою начальную позицию в следе и через несколько часов отправить свою окончательную позицию, что позволит серверу определить пройденное расстояние.

Я новичок в Android и, возможно, не выбираю лучший доступный вариант, но у меня возникли некоторые проблемы с FusedLocationProviderClient. Мой первый вариант был основан на методе getLastLocation (), с двумя кнопками, отправляющими, каждая из которых, начальную и конечную позицию, такую ​​как эта (здесь я просто редактирую TextView с полученными координатами, а клиент является экземпляром FusedLocationProviderClient):

Button button1 = findViewById(R.id.initialPosition);
    button1.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View view){
            if (ActivityCompat.checkSelfPermission(MainActivity.this, ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED){
               return;
            }

            client.getLastLocation().addOnSuccessListener(MainActivity.this, new OnSuccessListener<Location>() {
                @Override
                public void onSuccess(Location location) {

                    if(location != null){
                        initialLat = location.getLatitude();
                        initialLong = location.getLongitude();
                        TextView textView1 = findViewById(R.id.initialLatitude);
                        textView1.setText(Double.toString(initialLat));

                        TextView textView2 = findViewById(R.id.initialLongitude);
                        textView2.setText(Double.toString(initialLong));
                    }

                }
            });

        }
    });

    Button button2 = findViewById(R.id.endingPosition);
    button2.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View view){
            if (ActivityCompat.checkSelfPermission(MainActivity.this, ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED){
                return;
            }
            //client.requestLocationUpdates();
            client.getLastLocation().addOnSuccessListener(MainActivity.this, new OnSuccessListener<Location>() {
                @Override
                public void onSuccess(Location location) {

                    if(location != null){
                        finalLat = location.getLatitude();
                        finalLong = location.getLongitude();
                        TextView textView1 = findViewById(R.id.endingLatitude);
                        textView1.setText(Double.toString(finalLat));

                        TextView textView2 = findViewById(R.id.endingLongitude);
                        textView2.setText(Double.toString(finalLong));
                    }

                }
            });

        }
    });

Казалось, что это правильно работает для начальной позиции, но конечная позиция всегда соответствует начальной позиции. Я не уверен, что это произошло потому, что устройство не обновляет последнюю известную позицию в течение жизненного цикла приложения, если только его об этом не просят, или потому что последнее известное местоположение обновляется только после того, как произошло довольно долгое время. Это беспокоит меня, потому что, если последнее обновление было получено сотни метров назад, предполагаемое расстояние было бы ошибочным.

Короче говоря, я решил использовать метод requestLocationUpdates, предоставляемый API, но я не нашелподход, который ограничивает потребление батареи: кажется постоянным / периодически обновлять местоположение, если человек предоставит только начальную позицию, а спустя несколько часов - конечную позицию.

Как можно объединить эти два подхода? как я могу попросить пользователя о начальной (но только один раз обновленной позиции), остановить обновления, а затем, спустя несколько часов, выполнить одно обновление местоположения, чтобы получить точную конечную позицию, а затем прекратить отслеживать устройство?

Большое спасибо заранее!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...