Skip to content

Commit 188c666

Browse files
committed
Add foregroundServiceType support to AndroidManifest templates
This commit introduces support for the 'foregroundServiceType' attribute in the AndroidManifest templates across all bootstraps. This change allows specifying the service type for foreground services, which is a mandatory requirement for apps targeting Android 14 (API level 34) and above to prevent runtime crashes.
1 parent ad8f902 commit 188c666

File tree

6 files changed

+36
-9
lines changed

6 files changed

+36
-9
lines changed

pythonforandroid/bootstraps/_sdl_common/build/templates/AndroidManifest.tmpl.xml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,8 +115,11 @@
115115
<service android:name="{{ args.service_class_name }}"
116116
android:process=":pythonservice" />
117117
{% endif %}
118-
{% for name in service_names %}
118+
{% for name, foreground_type in service_data %}
119119
<service android:name="{{ args.package }}.Service{{ name|capitalize }}"
120+
{% if foreground_type %}
121+
android:foregroundServiceType="{{ foreground_type }}"
122+
{% endif %}
120123
android:process=":service_{{ name }}" />
121124
{% endfor %}
122125
{% for name in native_services %}

pythonforandroid/bootstraps/common/build/build.py

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -466,7 +466,7 @@ def make_package(args):
466466
if exists(service_main) or exists(service_main + 'o'):
467467
service = True
468468

469-
service_names = []
469+
service_data = []
470470
base_service_class = args.service_class_name.split('.')[-1]
471471
for sid, spec in enumerate(args.services):
472472
spec = spec.split(':')
@@ -476,8 +476,20 @@ def make_package(args):
476476

477477
foreground = 'foreground' in options
478478
sticky = 'sticky' in options
479+
foreground_type_option = next((s for s in options if s.startswith('foregroundServiceType')), None)
480+
if foreground_type_option:
481+
try:
482+
foreground_type = foreground_type_option.split('=')[1]
483+
if not foreground_type:
484+
raise ValueError('Missing value for `foregroundServiceType` option. '
485+
'Expected format: foregroundServiceType=location')
486+
except IndexError:
487+
raise ValueError('Missing value for `foregroundServiceType` option. '
488+
'Expected format: foregroundServiceType=location')
489+
else:
490+
foreground_type = None
479491

480-
service_names.append(name)
492+
service_data.append((name, foreground_type))
481493
service_target_path =\
482494
'src/main/java/{}/Service{}.java'.format(
483495
args.package.replace(".", "/"),
@@ -541,10 +553,10 @@ def make_package(args):
541553
render_args = {
542554
"args": args,
543555
"service": service,
544-
"service_names": service_names,
556+
"service_data": service_data,
545557
"android_api": android_api,
546558
"debug": "debug" in args.build_mode,
547-
"native_services": args.native_services
559+
"native_services": args.native_services,
548560
}
549561
if is_sdl_bootstrap():
550562
render_args["url_scheme"] = url_scheme

pythonforandroid/bootstraps/qt/build/templates/AndroidManifest.tmpl.xml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,8 +91,11 @@
9191
<service android:name="{{ args.service_class_name }}"
9292
android:process=":pythonservice" />
9393
{% endif %}
94-
{% for name in service_names %}
94+
{% for name, foreground_type in service_data %}
9595
<service android:name="{{ args.package }}.Service{{ name|capitalize }}"
96+
{% if foreground_type %}
97+
android:foregroundServiceType="{{ foreground_type }}"
98+
{% endif %}
9699
android:process=":service_{{ name }}" />
97100
{% endfor %}
98101
{% for name in native_services %}

pythonforandroid/bootstraps/service_library/build/templates/AndroidManifest.tmpl.xml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,11 @@
77
<uses-sdk android:minSdkVersion="{{ args.min_sdk_version }}" android:targetSdkVersion="{{ android_api }}" />
88

99
<application {% if debug %}android:debuggable="true"{% endif %} >
10-
{% for name in service_names %}
10+
{% for name, foreground_type in service_data %}
1111
<service android:name="{{ args.package }}.Service{{ name|capitalize }}"
12+
{% if foreground_type %}
13+
android:foregroundServiceType="{{ foreground_type }}"
14+
{% endif %}
1215
android:process=":service_{{ name }}"
1316
android:exported="true" />
1417
{% endfor %}

pythonforandroid/bootstraps/service_only/build/templates/AndroidManifest.tmpl.xml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,11 @@
7272
android:process=":pythonservice"
7373
android:exported="true"/>
7474
{% endif %}
75-
{% for name in service_names %}
75+
{% for name, foreground_type in service_data %}
7676
<service android:name="{{ args.package }}.Service{{ name|capitalize }}"
77+
{% if foreground_type %}
78+
android:foregroundServiceType="{{ foreground_type }}"
79+
{% endif %}
7780
android:process=":service_{{ name }}"
7881
android:exported="true" />
7982
{% endfor %}

pythonforandroid/bootstraps/webview/build/templates/AndroidManifest.tmpl.xml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,11 @@
8181
<service android:name="org.kivy.android.PythonService"
8282
android:process=":pythonservice" />
8383
{% endif %}
84-
{% for name in service_names %}
84+
{% for name, foreground_type in service_data %}
8585
<service android:name="{{ args.package }}.Service{{ name|capitalize }}"
86+
{% if foreground_type %}
87+
android:foregroundServiceType="{{ foreground_type }}"
88+
{% endif %}
8689
android:process=":service_{{ name }}" />
8790
{% endfor %}
8891

0 commit comments

Comments
 (0)