Skip to content
WebViewGold Vibe Coding to App Store
English
Get WebViewGold

Google Play rejection

Foreground service permissions on Google Play: complete the declaration or remove the service

Since Android 14, every foreground service has a declared type, and Google asks apps targeting Android 14 or later to justify each type in Play Console with a description and a video. A typical web-wrapped app needs no foreground service at all. If one shows up in your bundle, find out where it comes from, then either remove it or declare it with a video that matches the use case.

From $109 one-time per platform, or let our team do it all from $698.

  • Approval guarantee – or money back within 14 days
  • No coding needed
  • One-time payment, free updates
  • 24/7 human support
  • Made in Germany since 2014 · ISO 27001

What changed with Android 14 and what Google reviews

A foreground service is work an app keeps doing while the user is somewhere else, with an ongoing notification that makes it visible: music playback, navigation, a workout recording, a call. Since Android 14, each foreground service must declare a type (location, mediaPlayback, dataSync, camera, microphone, health, phoneCall and a few others) and the app must hold the matching FOREGROUND_SERVICE_* permission. Some types also need the underlying runtime permission, such as location access for the location type.

Google Play adds a review step on top. Apps that target Android 14 or later and use foreground services complete the foreground service declaration on the App content page. For each type you describe the feature that uses it, explain the impact on the user if the system deferred or interrupted the task, pick the matching use case from a list and link a video showing the steps a user takes to trigger the feature. Google's foreground service requirements describe the form. The expectation behind it: the user started the task or clearly notices it, and it cannot simply wait until later.

How the rejection reads

There are two typical situations. Before review, the upload or the release is blocked until you state whether the app uses foreground service permissions and declare each type it uses. After review, the declaration is rejected: the video does not show the feature, the selected use case does not match what the video shows, or the type is not justified for what the app does. Developers who keep uploading the same kind of video describe getting stuck in a loop. The way out is to fix the mismatch between feature, use case and video, or to remove the service.

Foreground service types you may find in a wrapped app

Type and permissionTypical sourceWhat to do
location / FOREGROUND_SERVICE_LOCATIONThe WebViewGold GPSService for background tracking (requireBackgroundLocation)Keep it only for user-started tracking that is core to the app; otherwise comment the blocks out again
mediaPlayback / FOREGROUND_SERVICE_MEDIA_PLAYBACKAn audio or media libraryKeep it only if playing audio with the screen off is a core feature
dataSync / FOREGROUND_SERVICE_DATA_SYNCSync, backup or upload librariesUsually remove; for transfers the user requests, Google points to user-initiated data transfer jobs
camera, microphone, phoneCallVideo call or voice SDKsOnly for real calling features
health / FOREGROUND_SERVICE_HEALTHFitness tracking librariesOnly while the user actively records a workout
specialUseRare, custom codeNeeds a written justification and is reviewed; it is not a shortcut around a type that fits

Great way of converting your web app to a native app! Fast turn-around, and a great way to get your apps into the app stores without the need to develop a full native app!

Kevin Joling · FlightConnections & TrainConnections · Trustpilot

Clean up first, then declare what remains

An hour for the cleanup and one video per type you keep.

  1. List every service and permission

    In Android Studio, open AndroidManifest.xml, switch to the Merged Manifest tab and search for foregroundServiceType and FOREGROUND_SERVICE. In Play Console, the App bundle explorer lists the permissions Google extracted from your bundle.

  2. Ask two questions per entry

    Does a user start it, and does the user notice it while it runs? If neither is true for a feature your app really offers, the service should not be in the app.

  3. Remove what you do not need

    For WebViewGold's location service, set requireBackgroundLocation to false and comment out the FOREGROUND_SERVICE_LOCATION and GPSService blocks (see the Android geolocation docs). For a library, remove the permission and its service with the rules below, then test the feature that library provides; removing a service a library still calls can make it crash.

  4. Record one short video per remaining type

    Screen-record on a real device: open the app, log in if needed, tap the control that starts the feature (for example a Start tracking button that calls backgroundlocationon://), show the ongoing notification, leave the app so the task visibly continues, then stop it. Upload it as an unlisted YouTube video.

  5. Fill in the declaration

    On the App content page, open the foreground service declaration and, per type, describe the feature in one or two sentences, explain what breaks if the task is deferred or interrupted, choose the use case that matches the video and paste the link.

  6. Rebuild and replace every track

    Higher version code, new bundle, and replace older bundles on the testing tracks. A type you removed should no longer need declaring once no active bundle contains it. The target API level guide explains why rebuilding from the current template matters here too.

Removing a foreground service a library merged in

Copy the exact class name from the Merged Manifest tab; the one below is a placeholder. Test the library's feature afterwards.

xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <!-- Remove a foreground service type the app does not use -->
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" tools:node="remove" />

    <application>
        <!-- Placeholder: use the class name shown in the Merged Manifest tab -->
        <service android:name="com.example.somelibrary.SyncForegroundService" tools:node="remove" />
    </application>

</manifest>

Template: declaration answers for a location tracking service

Describe one concrete feature, in the words a user would use, and make the video show exactly these steps.

For the foreground service declaration, location type (adapt the brackets)
Feature description: When a courier taps Start shift, [App name] starts a location foreground service that shares the courier's position with dispatch until the courier taps End shift. An ongoing notification is shown the whole time.

Impact if deferred or interrupted: Dispatch loses the courier's position during the delivery, customers see wrong arrival times, and orders cannot be reassigned when a courier is delayed. The task cannot be postponed, because the position is only useful in real time.

Use case: [the closest match from the list, for example user-initiated location sharing].

Video: [YouTube link], showing login with the test account from Sign-in details, Start shift, the ongoing notification, the app in the background with tracking active, and End shift.

The same feature is declared in the Location permissions declaration.

Frequently asked questions

My app runs nothing in the background. Why does Play Console ask about foreground services?

Because a FOREGROUND_SERVICE permission or a typed service is in your bundle, usually contributed by a library or a template block you do not need. Find it in the merged manifest and remove it; if nothing remains, the declaration is no longer needed.

Do push notifications need a foreground service?

No. OneSignal, Firebase Cloud Messaging and Pushwoosh deliver notifications through the system without a foreground service in your app, and scheduled local reminders are not a foreground service use case either.

Can I choose specialUse to skip the video?

specialUse is meant for tasks no other type covers, and Google reviews the written justification. Using it for something that clearly matches another type, such as location or media playback, invites a rejection.

What makes a declaration video fail?

It starts in the middle of the feature, skips the user action that starts the service, shows a different flow than the selected use case, or cannot be opened because the link is private. Keep it short, linear and viewable by anyone with the link.

Can I avoid the declaration by targeting an older Android version?

No. Google requires a recent target API level for new apps and updates, so every current app targets Android 14 or later and needs the declaration whenever it uses foreground services.

Three ways to get your app into the stores

Same result, different amount of work on your side. All three come with the approval guarantee and 24/7 human support.

Do it yourself

$109 per platform, one-time

The WebViewGold license: a finished Xcode or Android Studio project. Paste your URL, set name and icon, switch on features, build and submit. Free updates forever.

See plans on the main page

Cloud Builder

$349 per license, one-time add-on

No Mac, no Xcode, no Android Studio: configure in the browser, we build both apps in the cloud and hand them to App Store Connect and the Play Console.

How the Cloud Builder works Try the free demo

Full Service

$698 per platform $798

Send us your URL and icon. Our team configures, builds and delivers your app within 72 hours, white-label, with source projects. Both platforms for $1,158.

Full Service details Powered by WeSetupYourWebViewApp

Winter Sale prices valid until December 31, 2026.

Ready to ship your app?

App Store & Google Play approval guarantee – or your money back within 14 days

Rather hand it over? Full Service: we configure, build and deliver within 72 hours, from $698 per platform. Questions? Chat with us 24/7.

Refunds are granted under the conditions listed in our FAQ: a non-content rejection by Apple and/or Google, claimed within 14 days after purchase.