Я разрабатываю приложение для транзитной палочки, которое фиксирует автобусные маршруты и пассажирские остановки, а затем записывает их. Нужно ли мне использовать разрешение на фоновое определение местоположения? Я запрашиваю обновления местоположения в Службе и для этой цели использую Fused Location Provider.
В MainActivity (request-permission)
private void askForForegroundLocationPermission(Runnable backgroundPermission) {
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION)
!= PackageManager.PERMISSION_GRANTED ||
ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION)
!= PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this,
Manifest.permission.ACCESS_FINE_LOCATION) ||
ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this,
Manifest.permission.ACCESS_COARSE_LOCATION)) {
new AlertDialog.Builder(this)
.setTitle("Permission Needed!")
.setMessage("Location Permission Needed!")
.setPositiveButton("OK", (dialog, which) ->
ActivityCompat.requestPermissions(MainActivity.this,
new String[]{
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION
},
FOREGROUND_LOCATION_PERMISSION_CODE))
.setNegativeButton("CANCEL", null)
.create().show();
} else {
ActivityCompat.requestPermissions(MainActivity.this,
new String[]{
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION
},
FOREGROUND_LOCATION_PERMISSION_CODE);
}
} else {
if (backgroundPermission != null) {
backgroundPermission.run();
}
}
}
@RequiresApi(api = Build.VERSION_CODES.Q)
private void askForBackgroundLocationPermission() {
if (ContextCompat.checkSelfPermission(MainActivity.this,
Manifest.permission.ACCESS_BACKGROUND_LOCATION)
!= PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this,
Manifest.permission.ACCESS_BACKGROUND_LOCATION)) {
new AlertDialog.Builder(this)
.setTitle("Permission Needed!")
.setMessage("Background Location Permission Needed!")
.setPositiveButton("OK", (dialog, which) ->
ActivityCompat.requestPermissions(MainActivity.this,
new String[]{Manifest.permission.ACCESS_BACKGROUND_LOCATION},
BACKGROUND_LOCATION_PERMISSION_CODE))
.setNegativeButton("CANCEL", null)
.create().show();
} else {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{
Manifest.permission.ACCESS_BACKGROUND_LOCATION},
BACKGROUND_LOCATION_PERMISSION_CODE);
}
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == FOREGROUND_LOCATION_PERMISSION_CODE) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED &&
grantResults[1] == PackageManager.PERMISSION_GRANTED) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
askForBackgroundLocationPermission();
}
}
}
}
CaptureService — части, отвечающие за обработку проверок местоположения.
@SuppressLint("MissingPermission")
public void getCurrentLocation(OnSuccessListener successListener, OnFailureListener failureListener) {
CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
fusedLocationProviderClient.getCurrentLocation(Priority.PRIORITY_HIGH_ACCURACY, cancellationTokenSource.getToken())
.addOnSuccessListener(successListener)
.addOnFailureListener(failureListener);
}
public void onLocationChanged(Location location) {
Log.i("LOCATION", "onLocationChanged");
///POINTS RECORDED EVERY 5 METERS
if (currentCapture != null && location.getAccuracy() < 15 * 2) {
RoutePoint rp = new RoutePoint();
rp.location = location;
rp.time = SystemClock.elapsedRealtime();
currentCapture.points.add(rp);
if (lastLocation != null) {
currentCapture.distance += distanceFromLocation(lastLocation, location);
if (iCaptureActivity != null) {
iCaptureActivity.updateDistance();
}
}
lastLocation = location;
if (iCaptureActivity != null) {
iCaptureActivity.updateGpsStatus();
}
} else {
Log.e("Unable to update Location", "Unable to update Location");
}
}
@SuppressLint("MissingPermission")
public void startLocationTracking() {
fusedLocationProviderClient.requestLocationUpdates(locationRequest, locationCallback, Looper.getMainLooper())
.addOnSuccessListener(aVoid -> Log.i("Location", "All Ok"))
.addOnFailureListener(e -> Log.e("Location", "Error", e));
}
public void stopLocationTracking() {
fusedLocationProviderClient.removeLocationUpdates(locationCallback);
}
public void initLocation() {
Log.w("CaptureService", "initLocation");
fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this);
locationRequest = new LocationRequest.Builder(10 * 1000L)
.setMinUpdateDistanceMeters(5) /// change later to 5
.setWaitForAccurateLocation(true)
.setPriority(Priority.PRIORITY_HIGH_ACCURACY)
.build();
locationCallback = new LocationCallback() {
@Override
public void onLocationResult(@NonNull LocationResult locationResult) {
super.onLocationResult(locationResult);
CaptureService.this.onLocationChanged(locationResult.getLastLocation());
Log.w("initLocation Event", String.valueOf(locationResult.getLastLocation()));
}
};
}
public String getGpsStatus() {
String status = "";
if(lastLocation != null)
status = "GPS +/-" + Math.round(lastLocation.getAccuracy()) + "m";
else
status = "GPS Pending";
return status;
}
Google очень требовательно относится к этому разрешению, и мне нужно объяснить, почему мне нужно его использовать. Какие преимущества это дает моему приложению, если я его использую? Или может ли точный доступ к местоположению выполнять эту работу по умолчанию, например, если экран заблокирован или приложение не открыто, но работает вместе с другими приложениями? Пожалуйста, объясните это более подробно
Подробнее здесь: https://stackoverflow.com/questions/793 ... droid-java
Когда использовать разрешение на доступ к фоновому местоположению? Андроид Ява ⇐ JAVA
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Когда использовать разрешение на доступ к фоновому местоположению? Андроид Ява
Anonymous » » в форуме Android - 0 Ответы
- 13 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Когда использовать разрешение на доступ к фоновому местоположению? Андроид Ява
Anonymous » » в форуме JAVA - 0 Ответы
- 16 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Есть ли способ изменить шрифт для всей телефонной системы из моего приложения? (Андроид/Ява)
Anonymous » » в форуме JAVA - 0 Ответы
- 12 Просмотры
-
Последнее сообщение Anonymous
-