add permission in project
AndroidManifest.xml
<manifest ...>
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
MainActivity.java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_main);
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
return insets;
});
checkPermissions();
....
}
/*
* check permission to read contact and write shared folder Download
*/
private void checkPermissions() {
List<String> permissions = new ArrayList<>();
// 1. Android 13+ Notification Permission
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
permissions.add(Manifest.permission.POST_NOTIFICATIONS);
}
// API require string convert List<String> to String[];
requestPermissionLauncher.launch(permissions.toArray(new String[0]));
}
/*
* callback permission request
*/
private final ActivityResultLauncher<String[]> requestPermissionLauncher =
registerForActivityResult(new ActivityResultContracts.RequestMultiplePermissions(), result -> {
// Handle Notification permission (Android 13+)
boolean notificationsGranted = true;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
notificationsGranted = result.getOrDefault(Manifest.permission.POST_NOTIFICATIONS, false);
}
});
create MyNotificationService.java class
public class MyNotificationService {
public static final String CHANNEL_ID = "wredatexthelper"; //
public static final int NOTIF_ID = 1846496091; // crc from wredatexthelper
/*
* to send notification directly
*/
public static void sendNotification(Context context, String title, String message) {
NotificationManager notificationManager =
(NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
NotificationCompat.Builder myNotifBuilder = getNotificationBuilder(context);
myNotifBuilder
.setContentTitle(title)
.setContentText(message);
notificationManager.notify(NOTIF_ID, myNotifBuilder.build());
}
/*
* Helper that returns the BUILDER so you can customize it before building
*/
private static NotificationCompat.Builder getNotificationBuilder(Context context) {
NotificationManager notificationManager =
(NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
if (notificationManager.getNotificationChannel(CHANNEL_ID) == null) {
NotificationChannel notifChannel = new NotificationChannel(
CHANNEL_ID,
"Background Sync Service",
NotificationManager.IMPORTANCE_LOW
);
notificationManager.createNotificationChannel(notifChannel);
}
}
return new NotificationCompat.Builder(context, CHANNEL_ID)
.setSmallIcon(android.R.drawable.stat_notify_sync)
.setPriority(NotificationCompat.PRIORITY_LOW)
.setCategory(Notification.CATEGORY_SERVICE);
//.setOngoing(true); // can not swap away
}
/*
* get notification for foreground called from worker
*/
public static Notification getForegroundNotification(Context context) {
Notification myNotif = getNotificationBuilder(context).build();
return myNotif;
}
}