diff --git a/libraries/session/src/main/java/androidx/media3/session/MediaNotificationManager.java b/libraries/session/src/main/java/androidx/media3/session/MediaNotificationManager.java index 98a5833776..f8f79e4de4 100644 --- a/libraries/session/src/main/java/androidx/media3/session/MediaNotificationManager.java +++ b/libraries/session/src/main/java/androidx/media3/session/MediaNotificationManager.java @@ -203,6 +203,9 @@ import java.util.concurrent.TimeoutException; } } + // POST_NOTIFICATIONS permission is not required for media session related notifications. + // https://developer.android.com/develop/ui/views/notifications/notification-permission#exemptions-media-sessions + @SuppressLint("MissingPermission") private void updateNotificationInternal( MediaSession session, MediaNotification mediaNotification, diff --git a/libraries/ui/src/main/java/androidx/media3/ui/PlayerNotificationManager.java b/libraries/ui/src/main/java/androidx/media3/ui/PlayerNotificationManager.java index 973320e280..6821b54480 100644 --- a/libraries/ui/src/main/java/androidx/media3/ui/PlayerNotificationManager.java +++ b/libraries/ui/src/main/java/androidx/media3/ui/PlayerNotificationManager.java @@ -36,6 +36,7 @@ import static androidx.media3.common.util.Assertions.checkArgument; import static androidx.media3.common.util.Assertions.checkState; import static java.lang.annotation.ElementType.TYPE_USE; +import android.annotation.SuppressLint; import android.app.Notification; import android.app.NotificationChannel; import android.app.PendingIntent; @@ -165,12 +166,16 @@ import java.util.Map; *
  • {@code exo_notification_stop} - The stop icon. * * - *

    Alternatively, the action icons can be set programatically by using the {@link Builder}. + *

    Alternatively, the action icons can be set programmatically by using the {@link Builder}. * *

    Unlike the drawables above, the large icon (i.e. the icon passed to {@link * NotificationCompat.Builder#setLargeIcon(Bitmap)} cannot be overridden in this way. Instead, the * large icon is obtained from the {@link MediaDescriptionAdapter} passed to {@link * Builder#Builder(Context, int, String, MediaDescriptionAdapter)}. + * + *

    Note: This class would require {@link android.Manifest.permission#POST_NOTIFICATIONS} + * permission if used without a {@linkplain #setMediaSessionToken(MediaSessionCompat.Token) media + * session}. */ @UnstableApi public class PlayerNotificationManager { @@ -1184,6 +1189,10 @@ public class PlayerNotificationManager { } } + // This class is generally used with a media session which does not require notification + // permission. + // https://developer.android.com/develop/ui/views/notifications/notification-permission#exemptions-media-sessions + @SuppressLint("MissingPermission") private void startOrUpdateNotification(Player player, @Nullable Bitmap bitmap) { boolean ongoing = getOngoing(player); builder = createNotification(player, builder, ongoing, bitmap);