Despite having a non-dismissible dialog with a mandatory checkbox signifying user consent, my app got repeated Play Store rejections for background location tracking disclosure.
I have a Flutter app that has been live on the Google Play Store for 3 years. Recently, while trying to release an update, it got rejected for lacking a prominent disclosure before requesting background location permission.
What I Already Had Before:
- An alert dialog explaining why location access is needed, which appears immediately on launch.
- Permission is requested only if the user taps "OK" on the dialog.
Fix That I Implemented:
To further clarify user consent, I added:
- A mandatory checkbox with the label: "I understand and want to continue".
- The "OK" button remains disabled until the user checks the box.
The Problem:
- The update still got rejected!
- The screenshot attached in the rejection email shows a much older version (v47) instead of the latest one (v87).
- I appealed, explaining the fix and my suspicion that Google might be reviewing an outdated version.
- Two days later, they rejected it again with the exact same message and screenshot.
I downloaded the APK from the Play Console and tested it on multiple real devices (API 22 to 35), and the dialog works as expected every time.
My Question:
- Has anyone faced a similar issue?
- Could Google be reviewing an old version instead of the latest one? How can I ensure they evaluate the correct build?
- I'm fearing for deletion now if I submit again as it got rejected 4 times already, so how should I proceed now?
Screenshots attached bellow.
What playstore sends me with the rejection emails.
How my app actually looks like.
Any insights or suggestions would be greatly appreciated! Thanks.
Bellow is my manifest file.
<manifest xmlns:android="; xmlns:tools="; package="com.something.something">
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" tools:node="remove"/>
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>
<application android:name="${applicationName}" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:networkSecurityConfig="@xml/network_security_config">
<activity android:name=".MainActivity" android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode" android:exported="true" android:hardwareAccelerated="true" android:launchMode="singleTop" android:theme="@style/LaunchTheme" android:windowSoftInputMode="adjustResize">
<!-- Specifies an Android theme to apply to this Activity as soon as
the Android process has started. This theme is visible to the user
while the Flutter UI initializes. After that, this theme continues
to determine the Window background behind the Flutter UI. -->
<meta-data android:name="io.flutter.embedding.android.NormalTheme" android:resource="@style/NormalTheme"/>
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<service android:name="id.flutter.flutter_background_service.BackgroundService" android:exported="true" android:foregroundServiceType="location" android:permission="android.permission.FOREGROUND_SERVICE"/>
<!-- Don't delete the meta-data below.
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
<meta-data android:name="flutterEmbedding" android:value="2"/>
<!-- Google map api key -->
<meta-data android:name="com.google.android.geo.API_KEY" android:value="somethingsomethingsomethingsomethingsomething"/>
</application>
</manifest>