Вопрос такой, как можно сделать что-бы на сервер отправлялись мои координаты раз в 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;
}
}
}
Создайте таймер, а ещё лучше сервис с таймером и периодически отправляйте. В любом случае координаты у Вас обновятся не раньше, чем "железный" датчик устройства обнаружит изменение его местоположения и уведомит об этом систему.
Немножко уточню ответ, потому что из-за этого могут возникнуть дальнейшие сложности. Если нужно отсылать данные только тогда, когда приложение открыто создавать отдельный компонент Service для этого не стоит. Достаточно создать отдельный объект, который будет отвечать за отправку данных, внутри которого будет лежать таймер, и который будет крутиться на отдельном потоке. Так приложение будет потреблять меньше ресурсов. Если же данные должны отправляться в фоновом режиме, то обычный Service не поможет, необходимо использовать ForegroundService.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Мне нужно чтобы когда в EditText пользователь вводил данные (например 100000000 или +712361000000) то они разделялись точками или пробелами (на выходе что-то...
IDE использую eclipseНаписал следующую функцию, но при выводе элементов массива (не через цикл) начинает бесконечно выводить значения без выхода...
Например, методы генерируемые компилятором – values() и valueOf(String name) для перечислений (в классе Enum их нет): почему бы просто не объявить их как...