Notifications Without Permission

Notifications Without Permission

This is an error.

Id

NotificationPermission

Summary

Notifications Without Permission

Severity

Error

Category

Correctness

Platform

Android

Vendor

Android Open Source Project

Feedback

https://issuetracker.google.com/issues/new?component=192708

Since

7.4.0 (January 2023)

Affects

Kotlin and Java files and library bytecode

Editing

This check runs on the fly in the IDE editor

Implementation

Source Code

Tests

Source Code

When targeting Android 13 and higher, posting permissions requires holding the runtime permission android.permission.POST_NOTIFICATIONS.

This lint check has an associated quickfix available in the IDE.

Example

Here is an example of lint warnings produced by this check:

src/test/pkg/NotificationTestAndroidx.java:21:Error: When targeting
Android 13 or higher, posting a permission requires holding the
POST_NOTIFICATIONS permission [NotificationPermission]
    notificationManager.notify(id, notification);
    --------------------------------------------

Here are the relevant source files:

src/AndroidManifest.xml:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="test.pkg.permissiontest"> <uses-sdk android:minSdkVersion="17" android:targetSdkVersion="33" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> </manifest>

src/test/pkg/NotificationTestAndroidx.java:

package test.pkg; import android.app.Notification; import android.app.NotificationManager; import android.content.Context; import androidx.core.app.NotificationCompat; public class NotificationTestAndroidx { public void testAndroidX(Context context, String channelId, int id, int requestCode, int flags) { NotificationCompat.Builder builder = new NotificationCompat.Builder(context, channelId) .setSmallIcon(android.R.drawable.ic_menu_my_calendar) .setContentTitle("Notification Trampoline Test") .setContentText("Tap this notification to launch a new receiver") .setPriority(NotificationCompat.PRIORITY_DEFAULT) .setAutoCancel(true); Notification notification = builder.build(); NotificationManager notificationManager = context.getSystemService(NotificationManager.class); notificationManager.notify(id, notification); } }

You can also visit the source code for the unit tests for this check to see additional scenarios.

Suppressing

You can suppress false positives using one of the following mechanisms:

formatted by Markdeep 1.18