Declare and request in context
For the applicable platform path, declare:
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
Use the current notification-permission guidance for behavior by Android and target-SDK version. Explain the kind of notification the user is enabling rather than asking before the app has demonstrated its purpose.
A notification permission is not required on every older Android version, so guard version-specific requests appropriately.
Diagnose three independent layers
| Layer | Check |
|---|---|
| App-level access | Is notification permission currently granted where required? |
| Channel | Does the channel exist, and has the user disabled or changed it? |
| Delivery code | Was the notification actually posted with the correct channel and content? |
A successful push-message receipt does not prove a visible notification was posted. Conversely, a foreground data message may be intentionally handled without showing one.
Respect denial and settings changes
Keep the app usable when notifications are optional and declined. Provide a clear settings entry for users who later change their mind, but do not open settings repeatedly without an action from the user.
The runtime-permission model requires checking current access rather than trusting a past grant. Test returning to the app after access is revoked.
Test install and upgrade paths
Fresh installations, app upgrades and device upgrades can have different initial states. Test each relevant path on controlled devices. Include blocked channels, denied permission and a notification posted while the app is in the foreground and background.
Do not infer universal behavior from a development phone that already granted access months ago.
Review with APKLint
The Manifest Checker can verify the declaration and highlight related permission concerns. It cannot inspect a user's channel settings or guarantee delivery through a push service. Keep server receipt, client handling and visible presentation as separate diagnostics so the failure is fixed at the correct layer.
Sources and further reading
Reference review: 22 September 2026. Examples illustrate the workflow; check your installed versions, release artifact and account-specific Console requirements before applying them. This guide is not a claim that APKLint executed your project or verified your private account.



