Вопрос или проблема
java.lang.RuntimeException: Не удалось создать сервис id.flutter.flutter_background_service.BackgroundService: android.app.MissingForegroundServiceTypeException: Запуск FGS без типа callerApp=ProcessRecord{12281dd 12916:com.org/u0a590} targetSDK=34
И даже если я добавлю следующий сервис в файл манифеста Android
<service android:name=".YourBackgroundService" android:foregroundServiceType="location|dataSync|mediaPlayback" android:exported="false" />
Я не могу получить данные о местоположении, когда мое приложение в фоновом режиме или даже когда мое приложение убито
Ответ или решение
Проблема, с которой вы столкнулись, связана с изменениями в Android SDK, в частности, с тем, как обрабатываются фоновые службы начиная с версии 34. Давайте разберемся с основными шагами, которые вам необходимо предпринять для решения данной проблемы.
1. Настройка вашего сервиса в AndroidManifest.xml
Убедитесь, что вы правильно указали тип фонового сервиса. В вашем случае вы упоминаете использование нескольких типов (location|dataSync|mediaPlayback
). Вам нужно указать только те типы, которые необходимы для работы вашего сервиса. Если ваш сервис использует только геолокацию, измените строку следующим образом:
<service
android:name=".YourBackgroundService"
android:foregroundServiceType="location"
android:exported="false" />
Если вам действительно требуется несколько типов, убедитесь, что вы указываете их корректно и они соответствуют требованиям вашего приложения.
2. Реализация фонового сервиса
Обязательно проверьте реализацию вашего фонового сервиса. Он должен правильно обрабатывать ситуации, когда приложение работает в фоновом режиме. Например, используйте startForeground()
для запуска сервиса в фоне:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Notification notification = new NotificationCompat.Builder(this, CHANNEL_ID)
.setContentTitle("Your Service Title")
.setContentText("Your Service is running in the background")
.setSmallIcon(R.drawable.ic_notification)
.build();
startForeground(1, notification);
// ваш код для запуска фоновой работы
return START_STICKY;
}
3. Запрос разрешений
Убедитесь, что ваше приложение имеет все необходимые разрешения для работы в фоновом режиме. Начиная с Android 10, а затем и в версии 34, требуется специальное разрешение для доступа к местоположению в фоновом режиме. В вашем AndroidManifest.xml
добавьте следующее:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
4. Запрос разрешения во время выполнения
Не забудьте запрашивать разрешение на местоположение во время выполнения, так как начиная с Android 6.0 пользователи могут отклонять разрешения.
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_BACKGROUND_LOCATION}, YOUR_PERMISSION_REQUEST_CODE);
}
5. Проверка на наличие ошибок
Проверьте логи вашего приложения. Если вы все еще видите сообщение об ошибке MissingForegroundServiceTypeException
, убедитесь, что приложение использует правильный targetSdkVersion
в вашем build.gradle
файле:
android {
compileSdkVersion 34
defaultConfig {
targetSdkVersion 34
...
}
}
6. Отключение ограничений фона
Иногда фоновая работа может быть ограничена в настройках устройства. Убедитесь, что ваше приложение не находится в списке "Ограниченных фоновых данных", и у него включены все необходимые разрешения.
Заключение
После выполнения всех вышеперечисленных шагов ваше приложение должно корректно работать с фоновыми службами в Android 34. Если же проблемы остаются, возможно, вам стоит проверить реализацию вашего фонового сервиса или обратиться к документации по работе с фоновыми задачами и службами в Android.