1/ your app needs to send or show notifications, you must add the proper permission in the AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.Notification">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service
android:name=".MyFirebaseService"
android:exported="true">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
</application>
</manifest>
2/ This service handles incoming Firebase Cloud Messages and shows notifications to the user
package com.example.notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.content.pm.PackageManager;
import android.os.Build;
import androidx.annotation.NonNull;
import androidx.core.app.ActivityCompat;
import androidx.core.app.NotificationCompat;
import androidx.core.app.NotificationManagerCompat;
import com.google.firebase.messaging.FirebaseMessagingService;
import com.google.firebase.messaging.RemoteMessage;
public class MyFirebaseService extends FirebaseMessagingService {
@Override
public void onMessageReceived(@NonNull RemoteMessage message) {
super.onMessageReceived(message);
// Step 1: Create notification channel for Android O and above
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel channel = new NotificationChannel(
"fcm_notification", // Channel ID
"FCM Notification", // Channel Name
NotificationManager.IMPORTANCE_HIGH // Channel importance
);
NotificationManager manager = getSystemService(NotificationManager.class);
if (manager != null) {
manager.createNotificationChannel(channel);
}
}
// Step 2: Build notification if message contains notification payload
if (message.getNotification() != null) {
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, "fcm_notification")
.setSmallIcon(R.drawable.outline_ac_unit_24) // Notification icon
.setContentTitle(message.getNotification().getTitle()) // Notification title
.setContentText(message.getNotification().getBody()) // Notification body
.setAutoCancel(true) // Auto-dismiss when tapped
.setPriority(NotificationCompat.PRIORITY_HIGH); // High priority
NotificationManagerCompat managerCompat = NotificationManagerCompat.from(this);
// Step 3: Check POST_NOTIFICATIONS permission (required for Android 13+)
if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.POST_NOTIFICATIONS)
!= PackageManager.PERMISSION_GRANTED) {
return; // Exit if permission is not granted
}
// Step 4: Show the notification
managerCompat.notify(111, builder.build());
}
}
}
3/ This activity requests the notification permission on Android 13+ devices.
package com.example.notification;
import android.Manifest;
import android.os.Build;
import android.os.Bundle;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Step 1: Check if Android version is 13+ (Tiramisu)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
// Step 2: Check if POST_NOTIFICATIONS permission is already granted
if (ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS)
!= android.content.pm.PackageManager.PERMISSION_GRANTED) {
// Step 3: Create a launcher to request permission
ActivityResultLauncher<String> requestPermissionLauncher =
registerForActivityResult(
new ActivityResultContracts.RequestPermission(),
isGranted -> {
// Step 4: Optional: handle user's response here
if (isGranted) {
// Permission granted
} else {
// Permission denied
}
});
// Step 5: Launch the permission request
requestPermissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS);
}
}
}
}
4/ This dependency adds Firebase Cloud Messaging (FCM) support for handling push notifications in the app.
dependencies {
implementation(libs.appcompat)
implementation(libs.material)
implementation(libs.activity)
implementation(libs.constraintlayout)
testImplementation(libs.junit)
androidTestImplementation(libs.ext.junit)
androidTestImplementation(libs.espresso.core)
implementation("com.google.firebase:firebase-messaging:24.0.0")
}