Проблема, с которой я сталкиваюсь, заключается в том, что, когда пользователю предложено для разрешения на местоположное местоположение, он «не разрешается» нажат, процесс моего приложения заканчивается и перезагружается. После перезапуска он ведет себя, поскольку оно и разрешение на точное местоположение вместе с некоторыми другими никогда не было предоставлено, даже если оно было предоставлено до подсказки о фоновом разрешении. Я на Android 14. < /P>
Вот что происходит подробно: < /p>
Открыть приложение < /li>
Пользовательские гранты access_fine_location < /li>
Затем приложение показывает диалог. В диалоговом окне «Фоновое разрешение. Manifest.permission.access_fine_location) Но вместо этого он возвращает отклонено разрешение.public class LoginActivity extends AppCompatActivity {
private final ActivityResultLauncher requestPermissionLauncher =
registerForActivityResult(new ActivityResultContracts.RequestMultiplePermissions(), permissions -> {
boolean allGranted = true;
for (String permission : permissions.keySet()) {
boolean granted = Boolean.TRUE.equals(permissions.get(permission));
Log.d("APP", permission + " Permission: " + (granted ? "Granted" : "Denied"));
if (!granted) allGranted = false;
}
if (Permissions.hasLocationPermission(this)
&& Permissions.shouldRequestBackgroundPermission(this)) {
requestBackgroundLocation();
return;
}
// ...
});
private final ActivityResultLauncher requestBackgroundLocationLauncher =
registerForActivityResult(new ActivityResultContracts.RequestPermission(), isGranted -> {
if (isGranted) {
Log.d("APP", "Background location granted");
} else {
Log.d("APP", "Background location denied");
}
});
private void requestBackgroundLocation() {
new MaterialAlertDialogBuilder(this)
.setTitle("Background access")
.setMessage("This app requires background location...")
.setPositiveButton("OK", (dialog, which) ->
requestBackgroundLocationLauncher.launch(Manifest.permission.ACCESS_BACKGROUND_LOCATION))
.show();
}
private void startLocationService() {
if (Permissions.hasBackgroundLocationPermission(this)) {
Log.d(Constants.TAG, "Starting background location service");
Intent serviceIntent = new Intent(this, LocationService.class);
ContextCompat.startForegroundService(this, serviceIntent);
} else {
Log.d(Constants.TAG, "Background location not granted; skipping service start");
}
}
...
}
< /code>
permissions.java
public class Permissions {
public static boolean hasLocationPermission(Context context) {
return ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION)
== PackageManager.PERMISSION_GRANTED
|| ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION)
== PackageManager.PERMISSION_GRANTED;
}
public static boolean hasBackgroundLocationPermission(Context context) {
return ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_BACKGROUND_LOCATION)
== PackageManager.PERMISSION_GRANTED;
}
public static boolean shouldRequestBackgroundPermission(Context context) {
return hasLocationPermission(context) && !hasBackgroundLocationPermission(context);
}
}
< /code>
ps. Я уже добавил все необходимые объявления о фоновом местоположении в файле Manifest, а также внедренный класс услуг.>
Подробнее здесь: https://stackoverflow.com/questions/797 ... hen-denyin