Краш приложения Flutter после обновления целевой версии с 33 на 34

Вопрос или проблема

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.

Оцените материал
Добавить комментарий

Капча загружается...