У меня есть служба переднего плана с уведомлением, которая отслеживает местоположение пользователя, но в 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
Сбой с ForegroundServiceDidNotStartInTimeException на Android 14 ⇐ Android
Форум для тех, кто программирует под Android
-
Anonymous
1729102591
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);
}
}
[b]startForegroundService(i);[/b] — это строка 326.
Это моя служба отслеживания местоположения на переднем плане с [b] startCommand[/b], где я сначала пытаюсь запустить службу с уведомлением.
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 у меня есть это:
Подробнее здесь: [url]https://stackoverflow.com/questions/78972131/crash-with-foregroundservicedidnotstartintimeexception-on-android-14[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия