Background Service is not working on Android 14
Opened this issue · 10 comments
Background Service is not working on Android 14 , even after '' Allow all the time " manually . Service is not working in background and phone lock mode.
Same problem when i upgrade the targetSdkVersion to 34
I am already working on it. Please wait for the newer version.
On targetSdkVersion 34, you need to request for POST_NOTIFICATIONS before starting the service
import { Platform } from "react-native";
import Permissions from "react-native-permissions";
// You can use PermissionsAndroid
const startForegroundService = async () => {
if (Platform.Version >= 33) {
const response = await Permissions.request(
Permissions.PERMISSIONS.ANDROID.POST_NOTIFICATIONS
);
if (response !== Permissions.RESULTS.GRANTED) {
return;
}
}
// Start the service
};
in my case, i settled the android:foregroundServiceType
in AndroidManifest.xml
like this and it works:
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_LOCATION" />
<service android:name="com.supersami.foregroundservice.ForegroundService" android:foregroundServiceType="location"></service>
<service android:name="com.supersami.foregroundservice.ForegroundServiceTask" android:foregroundServiceType="location"></service>
The value of android:foregroundServiceType
depends of you use case. More details here:
In my case, android:foregroundServiceType="microphone"
, I had to request for PermissionsAndroid.RECORD_AUDIO
before starting the service
@dukizwe this is a final solution ? im try to restart service for my company on phone with android 14 the foreground service not working..
@nmagliorua for me the solution i shared fixed the issue. you need to try it and see if it can also fix the issue
Just to add my findings, since this doesnt seem to be in the documentation yet:
you can now add a Servicetype
to the start
function, that will map the ServiceType to the right module that startForeground()
expects:
return ReactNativeForegroundService.start({
id: 123,
title: 'SomeTitle',
message: 'SomeMesssage',
icon: 'some_icon',
ServiceType: 'location'
});
Here is the mapping in ForegroundService.java
as of 2.2.1
:
switch (customServiceType) {
case "camera":
return ServiceInfo.FOREGROUND_SERVICE_TYPE_CAMERA;
case "connectedDevice":
return ServiceInfo.FOREGROUND_SERVICE_TYPE_CONNECTED_DEVICE;
case "dataSync":
return ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC;
case "health":
return ServiceInfo.FOREGROUND_SERVICE_TYPE_HEALTH;
case "location":
return ServiceInfo.FOREGROUND_SERVICE_TYPE_LOCATION;
case "mediaPlayback":
return ServiceInfo.FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK;
case "mediaProjection":
return ServiceInfo.FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTION;
case "microphone":
return ServiceInfo.FOREGROUND_SERVICE_TYPE_MICROPHONE;
case "phoneCall":
return ServiceInfo.FOREGROUND_SERVICE_TYPE_PHONE_CALL;
case "remoteMessaging":
return ServiceInfo.FOREGROUND_SERVICE_TYPE_REMOTE_MESSAGING;
case "shortService":
return ServiceInfo.FOREGROUND_SERVICE_TYPE_SHORT_SERVICE;
case "specialUse":
return ServiceInfo.FOREGROUND_SERVICE_TYPE_SPECIAL_USE;
case "systemExempted":
return ServiceInfo.FOREGROUND_SERVICE_TYPE_SYSTEM_EXEMPTED;
default:
throw new IllegalArgumentException("Unknown foreground service type: " + customServiceType);
}
The other declarations like here #98 (comment) still apply.
Edit: Forgot to mention that i got the Service running as expected.
Also the android dev documentation for service types and their requirements: https://developer.android.com/about/versions/14/changes/fgs-types-required
Every service type has some required permissions that we need. Please make sure you go through what service location peer permission we required.
Android: 14
React Native : 0.74.3
You might see the "Start Service Triggered" message, but no callback will occur because the task isn’t actually added.
Here's the full explanation:
The issue lies with add_task
, which gets removed when the app is closed, causing tasks to stop.
As a workaround, when a notification is received, I check if the task is already running using the is_task_running
API.
If it is, I proceed to start the task. If it isn’t, I reinitialize it by calling ReactNativeForegroundService.add_task(...)
and then send an immediate notification. When this new notification is received, the task is successfully added and continues to run, allowing the foreground task to start as expected.
I hope this helps clarify the workaround!