This is an error.
| |
Notifications Without Permission | |
Error | |
Correctness | |
Android | |
Android Open Source Project | |
7.4.0 (January 2023) | |
Kotlin and Java files and library bytecode | |
This check runs on the fly in the IDE editor | |
android.permission.POST_NOTIFICATIONS
.
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.
You can suppress false positives using one of the following mechanisms:
// Kotlin
@Suppress("NotificationPermission")
fun method() {
notify(...)
}
or
// Java
@SuppressWarnings("NotificationPermission")
void method() {
notify(...);
}
//noinspection NotificationPermission
problematicStatement()
lint.xml
file in the source tree which turns off
the check in that folder and any sub folder. A simple file might look
like this:
<?xml version="1.0" encoding="UTF-8"?>
<lint>
<issue id="NotificationPermission" severity="ignore" />
</lint>
Instead of ignore
you can also change the severity here, for
example from error
to warning
. You can find additional
documentation on how to filter issues by path, regular expression and
so on
here.
lintOptions {
disable 'NotificationPermission'
}
In Android projects this should be nested inside an android { }
block.
lint
, using the --ignore
flag:
$ lint --ignore NotificationPermission ...`