Когда использовать разрешение на доступ к фоновому местоположению? Андроид ЯваJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Когда использовать разрешение на доступ к фоновому местоположению? Андроид Ява

Сообщение Anonymous »

Я разрабатываю приложение для транзитной палочки, которое фиксирует автобусные маршруты и пассажирские остановки, а затем записывает их. Нужно ли мне использовать разрешение на фоновое определение местоположения? Я запрашиваю обновления местоположения в Службе и для этой цели использую 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»