Сбой с ForegroundServiceDidNotStartInTimeException на Android 14Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Сбой с ForegroundServiceDidNotStartInTimeException на Android 14

Сообщение Anonymous »

У меня есть служба переднего плана с уведомлением, которая отслеживает местоположение пользователя, но в Crashlytics я вижу, что приложение вылетает у некоторых пользователей с Android 14. Я не могу это воспроизвести.
Fatal Exception: android.app.RemoteServiceException$ForegroundServiceDidNotStartInTimeException: Context.startForegroundService() did not then call Service.startForeground(): ServiceRecord{2170719 u0 com.anstar.fieldworkhq/.coordinates.ServiceTechnicianTrackingService}
at android.app.ActivityThread.generateForegroundServiceDidNotStartInTimeException(ActivityThread.java:2315)
at android.app.ActivityThread.throwRemoteServiceException(ActivityThread.java:2286)
Caused by android.app.StackTrace: Last startServiceCommon() call for this service was made here
at android.app.ContextImpl.startServiceCommon(ContextImpl.java:2023)
at android.app.ContextImpl.startForegroundService(ContextImpl.java:1967)
at android.content.ContextWrapper.startForegroundService(ContextWrapper.java:847)
at android.content.ContextWrapper.startForegroundService(ContextWrapper.java:847)
at com.zoran.app.main.MainActivity$$ExternalSyntheticApiModelOutline0.m(D8$$SyntheticClass)
at com.zoran.app.main.MainActivity.startForegroundService(MainActivity.java:326)
at com.zoran.app.main.MainActivity.tryToStartForegroundLocationService(MainActivity.java:313)
at com.zoran.app.main.MainActivity.trackLocationIfNeeded(MainActivity.java:220)
at com.zoran.app.main.MainActivity.onCreate(MainActivity.java:95)
at android.app.Activity.performCreate(Activity.java:8975)
at android.app.Activity.performCreate(Activity.java:8944)

Как вы можете видеть, сбой произошел в MainActivity, когда я попытался запустить службу переднего плана с помощью этого кода:
private void trackLocationIfNeeded() {
if (presenter.isTrackable()) {
if (ViewUtil.isPlayServiceAvailable(this)) {
if (isForegroundLocationPermissionGranted() && presenter.isTrackTechnicianRouteAllowed()) {
tryToStartForegroundLocationService();
presenter.saveThatUserAskedForPermission();
} else {
if (!presenter.isUserAskedForLocationPermission()) {
askForLocationPermission();
presenter.saveThatUserAskedForPermission();
}
}
}
} else {
stopServiceTechnicianLocationService();
}
}

private void tryToStartForegroundLocationService() {
if(Utils.isPlayServiceAvailable(this)) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
if(isPostNotificationsPermissionGranted()) {
startForegroundService();
} else {
askForPostNotificationsPermission();
}
} else {
startForegroundService();
}
}
}

private void startForegroundService() {
Intent i = new Intent(this, ServiceTechnicianTrackingService.class);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
startForegroundService(i);
} else {
startService(i);
}
}

startForegroundService(i); — это строка 326.
Это моя служба отслеживания местоположения на переднем плане с startCommand, где я сначала пытаюсь запустить службу с уведомлением.
public class ServiceTechnicianTrackingService extends Service {

private FusedLocationProviderClient fusedLocationProviderClient;
private LocationCallback locationCallback;

@Inject ServiceTechnicianLocationManager serviceTechnicianCoordinateManager;
@Inject NetworkManager NetworkManager;

public static final String ACTION_STOP_SERVICE = "action_stop_service";
private boolean isStarted = false;

@Nullable @Override public IBinder onBind(Intent intent) {
return null;
}

@Override public void onCreate() {
super.onCreate();
injector().inject(this);

fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this);
locationCallback = new LocationCallback() {
@Override public void onLocationResult(@NotNull LocationResult locationResult) {
if(locationResult != null && locationResult.getLastLocation() != null) {
super.onLocationResult(locationResult);
String lat = String.valueOf(locationResult.getLastLocation().getLatitude());
String lng = String.valueOf(locationResult.getLastLocation().getLongitude());

Timber.d("Lat is: " + lat + " lng is: " + lng);
if(networkManager.isNetworkAvailable()) {
serviceTechnicianCoordinateManager.updateCurrentLocation(new Coordinate(lat, lng));
}
}
}
};
}
@Override public int onStartCommand(Intent intent, int flags, int startId) {
// Call startForeground early to prevent the exception
if(!isStarted) {
startForegroundAndDisplayNotification();
isStarted = true;
}

if(intent != null) {
String action = intent.getAction();
if(ACTION_STOP_SERVICE.equalsIgnoreCase(action)) {
stopForeground(true);
stopSelf();
} else {
requestLocationUpdates();
}
}
return START_STICKY;
}

@Override public void onDestroy() {
super.onDestroy();
stopLocationUpdates();
isStarted = false;
}

private void startForegroundAndDisplayNotification() {
if (Build.VERSION.SDK_INT >= 26) {
try {
Notification notification = createNotification();
startForeground(1, notification);
} catch (Exception e) {
Timber.e(e, "Exception in startForegroundAndDisplayNotification");
}
}
}

В файле AndroidManifest у меня есть это:









Подробнее здесь: https://stackoverflow.com/questions/789 ... android-14
Ответить

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

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

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

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

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