Как можно отправлять координаты каждые 5 секунд?

292
29 ноября 2021, 14:30

Вопрос такой, как можно сделать что-бы на сервер отправлялись мои координаты раз в 5 секунд

public class MainActivity extends AppCompatActivity {
int PERMISSION_ID = 44;
FusedLocationProviderClient mFusedLocationClient;
TextView latTextView, lonTextView;
private Socket socket;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ConnectionAsyncTask con = new ConnectionAsyncTask();
    con.execute("192.168.0.40", "7788");
    latTextView = findViewById(R.id.latTextView);
    lonTextView = findViewById(R.id.lonTextView);
    mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
    getLastLocation();
}
@SuppressLint("MissingPermission")
private void getLastLocation() {
    if (checkPermissions()) {
        if (isLocationEnabled()) {
            mFusedLocationClient.getLastLocation().addOnCompleteListener(
                    new OnCompleteListener<Location>() {
                        @Override
                        public void onComplete(@NonNull Task<Location> task) {
                            Location location = task.getResult();
                            if (location == null) {
                                requestNewLocationData();
                            } else {
                                Gson gson = new Gson();
                                String jsonCoords;
                                //Этот фрагмент кода

                                        double lat = location.getLatitude();
                                        double lon = location.getLongitude();
                                        Log.d("TAG", String.valueOf(lat));
                                        Log.d("TAG", String.valueOf(lon));
                                        Model model = new Model(lat, lon);
                                        jsonCoords = gson.toJson(model);
                                        Log.d("TAG", String.valueOf(model));
                                        SendAsyncTask sendAsyncTask = new SendAsyncTask();// {"lat": 37.4334, "lon": -122.32}
                                        sendAsyncTask.execute(jsonCoords);
                                             //
                            }
                        }
                    }
            );
        } else {
            Toast.makeText(this, "Turn on location", Toast.LENGTH_LONG).show();
            Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
            startActivity(intent);
        }
    } else {
        requestPermissions();
    }
}

@SuppressLint("MissingPermission")
private void requestNewLocationData() {
    LocationRequest mLocationRequest = new LocationRequest();
    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    mLocationRequest.setInterval(0);
    mLocationRequest.setFastestInterval(0);
    mLocationRequest.setNumUpdates(1);
    mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
    mFusedLocationClient.requestLocationUpdates(
            mLocationRequest, mLocationCallback,
            Looper.myLooper()
    );
}
private LocationCallback mLocationCallback = new LocationCallback() {
    @Override
    public void onLocationResult(LocationResult locationResult) {
        Location mLastLocation = locationResult.getLastLocation();
        latTextView.setText(mLastLocation.getLatitude() + "");
        lonTextView.setText(mLastLocation.getLongitude() + "");
    }
};
private boolean checkPermissions() {
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED &&
            ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
        return true;
    }
    return false;
}
private void requestPermissions() {
    ActivityCompat.requestPermissions(
            this,
            new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION},
            PERMISSION_ID
    );
}
private boolean isLocationEnabled() {
    LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    return locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) || locationManager.isProviderEnabled(
            LocationManager.NETWORK_PROVIDER
    );
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == PERMISSION_ID) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            getLastLocation();
        }
    }
}
@Override
public void onResume() {
    super.onResume();
    if (checkPermissions()) {
        getLastLocation();
    }
}
class ConnectionAsyncTask extends AsyncTask<String, Void, Socket> {
    Socket s = null;
    @Override
    protected Socket doInBackground(String... params) {
        try {
            s = new Socket(params[0], Integer.parseInt(params[1]));
            socket = s;
            Log.d("Tag", s.toString());
        } catch (IOException e) {
            e.printStackTrace();
        }
        return s;
    }
}
class SendAsyncTask extends AsyncTask<String, String, Void> {
    @Override
    protected Void doInBackground(String... params) {
        try (PrintWriter printWriter = new PrintWriter(new BufferedOutputStream(socket.getOutputStream()))) {
            printWriter.write(params[0] + "\n");
            printWriter.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}
}
Answer 1

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

Немножко уточню ответ, потому что из-за этого могут возникнуть дальнейшие сложности. Если нужно отсылать данные только тогда, когда приложение открыто создавать отдельный компонент Service для этого не стоит. Достаточно создать отдельный объект, который будет отвечать за отправку данных, внутри которого будет лежать таймер, и который будет крутиться на отдельном потоке. Так приложение будет потреблять меньше ресурсов. Если же данные должны отправляться в фоновом режиме, то обычный Service не поможет, необходимо использовать ForegroundService.

READ ALSO
Android EditText(TextView) декорация текста

Android EditText(TextView) декорация текста

Мне нужно чтобы когда в EditText пользователь вводил данные (например 100000000 или +712361000000) то они разделялись точками или пробелами (на выходе что-то...

136
Программа уходит в бесконечный цикл

Программа уходит в бесконечный цикл

IDE использую eclipseНаписал следующую функцию, но при выводе элементов массива (не через цикл) начинает бесконечно выводить значения без выхода...

74
Генерируемые компилятором методы – в чём смысл?

Генерируемые компилятором методы – в чём смысл?

Например, методы генерируемые компилятором – values() и valueOf(String name) для перечислений (в классе Enum их нет): почему бы просто не объявить их как...

92
Вывод многострочного текста

Вывод многострочного текста

Как быстро выводить многострочный текст?

98