• XSS.stack #1 – первый литературный журнал от юзеров форума

Android 14 Не работает Живучесть (Foreground)

XDRevil

(L2) cache
Забанен
Регистрация
15.03.2024
Сообщения
457
Реакции
119
Депозит
0.00
Пожалуйста, обратите внимание, что пользователь заблокирован
Вечером я заметил, что на моем Xiaomi Poco X5 Pro с Android 14 не работает фоновый режим. Проверил журнал логов (Log Cat), ошибок не обнаружено.


Есть ли темы, связанные с фоновым режимом? (Которые исправили)
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Пожалуйста, обратите внимание, что пользователь заблокирован
Сообщение:startForegroundService() not allowed due to mAllowStartForeground false: service com.amazon.zzz/.EndlessWorking

Эта строка сообщает, что попытка запуска фона службы (foreground service) не удалась, потому что система не разрешает это в текущих условиях. Флаг mAllowStartForeground установлен в значение false, что означает, что запуск службы в фоновом режиме запрещён для этого сервиса com.amazon.zzz/.EndlessWorking.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Сообщение:startForegroundService() not allowed due to mAllowStartForeground false: service com.amazon.zzz/.EndlessWorking

Эта строка сообщает, что попытка запуска фона службы (foreground service) не удалась, потому что система не разрешает это в текущих условиях. Флаг mAllowStartForeground установлен в значение false, что означает, что запуск службы в фоновом режиме запрещён для этого сервиса com.amazon.zzz/.EndlessWorking.

Объявить новое разрешение на использование типов служб переднего плана​

Если приложения, предназначенные для Android 14, используют службу переднего плана, они должны объявить определенное разрешение, основанное на типе службы переднего плана, которое представлено в Android 14. Эти разрешения отображаются в разделах с надписью «разрешения, которые вы должны объявить в файле манифеста» в предполагаемых вариантах использования и принудительном исполнении для каждого раздела типа службы переднего плана на этой странице.

Все разрешения определяются как обычные разрешения и предоставляются по умолчанию. Пользователи не могут отозвать эти разрешения.

Внимание: если вы вызываете startForeground() без объявления соответствующего разрешения типа службы переднего плана, система выдает SecurityException .

Включить тип службы переднего плана во время выполнения​

Лучше всего для приложений, запускающих службы переднего плана, использовать версию startForeground() для ServiceCompat (доступную в androidx-core 1.12 и выше), куда вы передаете поразрядное целое число типов служб переднего плана. Вы можете передать одно или несколько значений типа.

Обычно следует объявлять только те типы, которые необходимы для конкретного варианта использования. Это упрощает удовлетворение ожиданий системы для каждого типа приоритетных служб . В случаях, когда служба переднего плана запускается с несколькими типами, она должна соответствовать требованиям платформы всех типов.


ServiceCompat.startForeground(0, notification, FOREGROUND_SERVICE_TYPE_LOCATION)
 
Пожалуйста, обратите внимание, что пользователь заблокирован
какое решение в итоге?
Проблема в старте Форграунда (Что остальном все в порядке)
 
Проблема в старте Форграунда (Что остальном все в порядке)
при старте Foreground сервиса иконка notification появляется, ты ее оставляешь как есть? или есть какой-то способ избавиться от нее?
 
Пожалуйста, обратите внимание, что пользователь заблокирован
при старте Foreground сервиса иконка notification появляется, ты ее оставляешь как есть? или есть какой-то способ избавиться от нее?
Просто можно удалить .setSmallIcon(R.mipmap.icon) это
 
Подскажите по поводу самостоятельного перезапуска сервиса. Я когда в уведомлениях сам останавливаю сервис, он не перезапускается, хотя все условия такого функционала соблюдаю. Должен ли он таким образом стартовать, или это только в том случае, если его сам андроид остановит?

NotificationChannel
Java:
private void createNotificationChannel() {
        NotificationChannel serviceChannel = new NotificationChannel(
                CHANNEL_ID,
                "Main Service Channel",
                NotificationManager.IMPORTANCE_MIN
        );
        NotificationManager manager = getSystemService(NotificationManager.class);
        manager.createNotificationChannel(serviceChannel);
    }

Wakelock
Java:
private void acquireWakeLock() {
        PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
        if (powerManager != null) {
            wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
                    "MainService::WakeLock");
            wakeLock.acquire(24 * 60 * 60 * 1000L /*24 hours*/);
        }
    }

Foregroung Service
Java:
private void startForegroundService() {
        Intent notificationIntent = new Intent(this, MainActivity.class);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,
                notificationIntent, PendingIntent.FLAG_IMMUTABLE);

        Notification notification = new NotificationCompat.Builder(this, CHANNEL_ID)
                .setContentTitle("Main Service")
                .setContentText("Service is running in the background")
                .setSmallIcon(android.R.drawable.ic_menu_gallery)
                .setContentIntent(pendingIntent)
                .build();

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R)
            startForeground(1, notification, ServiceInfo.FOREGROUND_SERVICE_TYPE_MICROPHONE);
        else startForeground(1, notification);
    }

В onStartCommand возвращаю START_STICKY

Вызов сервиса:
Java:
startForegroundService(new Intent(this, MainService.class));

Объявление в манифесте:

XML:
<service
            android:name=".MainService"
            android:enabled="true"
            android:exported="true"
            android:foregroundServiceType="microphone"
            android:permission="android.permission.FOREGROUND_SERVICE"/>
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Подскажите по поводу самостоятельного перезапуска сервиса. Я когда в уведомлениях сам останавливаю сервис, он не перезапускается, хотя все условия такого функционала соблюдаю. Должен ли он таким образом стартовать, или это только в том случае, если его сам андроид остановит?

NotificationChannel
Java:
private void createNotificationChannel() {
        NotificationChannel serviceChannel = new NotificationChannel(
                CHANNEL_ID,
                "Main Service Channel",
                NotificationManager.IMPORTANCE_MIN
        );
        NotificationManager manager = getSystemService(NotificationManager.class);
        manager.createNotificationChannel(serviceChannel);
    }

Wakelock
Java:
private void acquireWakeLock() {
        PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
        if (powerManager != null) {
            wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
                    "MainService::WakeLock");
            wakeLock.acquire(24 * 60 * 60 * 1000L /*24 hours*/);
        }
    }

Foregroung Service
Java:
private void startForegroundService() {
        Intent notificationIntent = new Intent(this, MainActivity.class);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,
                notificationIntent, PendingIntent.FLAG_IMMUTABLE);

        Notification notification = new NotificationCompat.Builder(this, CHANNEL_ID)
                .setContentTitle("Main Service")
                .setContentText("Service is running in the background")
                .setSmallIcon(android.R.drawable.ic_menu_gallery)
                .setContentIntent(pendingIntent)
                .build();

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R)
            startForeground(1, notification, ServiceInfo.FOREGROUND_SERVICE_TYPE_MICROPHONE);
        else startForeground(1, notification);
    }

В onStartCommand возвращаю START_STICKY

Вызов сервиса:
Java:
startForegroundService(new Intent(this, MainService.class));

Объявление в манифесте:

XML:
<service
            android:name=".MainService"
            android:enabled="true"
            android:exported="true"
            android:foregroundServiceType="microphone"
            android:permission="android.permission.FOREGROUND_SERVICE"/>
Надо Аларм(Нужно выдать сам DozeMode, чтоб точно перезапускал) использовать чтоб перезапускал Receiver
 
Надо Аларм(Нужно выдать сам DozeMode, чтоб точно перезапускал) использовать чтоб перезапускал Receiver
Ну в общем написал я аларм, который запускает ресивер, который в свою очередь запускает сервис, но при выполнении такой команды:

Java:
alarmManager.setExactAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME_WAKEUP,
                    SystemClock.elapsedRealtime() + interval, pendingIntent);
Просит разрешение:
XML:
<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" />
На которое IDE ругается, якобы только для системных приложений
В итоге код не работает и при остановке сервиса руками ничего дальше не происходит
Правильная ли реализация? И можно ли как-то обойти это ограничение разрешения?

Полный код изменений:

Java:
// restart function
@SuppressLint("ScheduleExactAlarm")
    private void setRestartAlarm() {
        Intent intent = new Intent(this, RestartReceiver.class);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

        AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        if (alarmManager != null) {
            long interval = 60 * 1000;
            alarmManager.setExactAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME_WAKEUP,
                    SystemClock.elapsedRealtime() + interval, pendingIntent);
        }
    }

// call restart function
@Override
    public void onDestroy() {
        super.onDestroy();
        setRestartAlarm();
    }

// receiver
public static class RestartReceiver extends BroadcastReceiver {
        @SuppressLint("UnsafeProtectedBroadcastReceiver")
        @Override
        public void onReceive(Context context, Intent intent) {
            Intent serviceIntent = new Intent(context, MainService.class);
            context.startForegroundService(serviceIntent);
        }
    }


XML:
<!-- initialization in manifest -->
<receiver android:name=".MainService$RestartReceiver"
          android:exported="false">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED"/>
    </intent-filter>
</receiver>
 
Пожалуйста, обратите внимание, что пользователь заблокирован
И можно ли как-то обойти это ограничение разрешения?
никак
Правильная ли реализация? И можно ли как-то обойти это ограничение разрешения?
foreground должен запускать метод аларма в onStartCommand, можешь чекнуть исходники малвари эрмака и хука
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх