https://medium.com/google-exoplayer/playback-notifications-with-exoplayer-a2f1a18cf93b
PlayerNotificationManager를 통해 미디어재생 시 알림센터에 정보를 표시하고 제어할 수 있다.
1. PlayerNotificationManager인스턴스 생성
2. PlayerNotificationManager.MediaDescriptionAdapter 로 재생중인 미디어 아이템 정보를 제공
3. 플레이어에 연결, 리소스가 소거되었을 때는 연결해제
PlayerNotificationManager 인스턴스 생성
activity나 fragment의 onCreate에서 생성한다.
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
playerNotificationManager = new PlayerNotificationManager(
this,
new DescriptionAdapter(),
CHANNEL_ID,
NOTIFICATION_ID);
}
채널아이디, 알림아이디, 그리고 재생중인 미디어 정보를 제공하기 위해 MediaDescriptionAdapter를 확장한 DescriptionAdapter를 파라메터로 넘긴다.
private class DescriptionAdapter implements
PlayerNotificationManager.MediaDescriptionAdapter {
@Override
public String getCurrentContentTitle(Player player) {
int window = player.getCurrentWindowIndex();
return getTitle(window);
}
@Nullable
@Override
public String getCurrentContentText(Player player) {
int window = player.getCurrentWindowIndex();
return getDescription(window);
}
@Nullable
@Override
public Bitmap getCurrentLargeIcon(Player player,
PlayerNotificationManager.BitmapCallback callback) {
int window = player.getCurrentWindowIndex();
Bitmap largeIcon = getLargeIcon(window);
if (largeIcon == null && getLargeIconUri(window) != null) {
// load bitmap async
loadBitmap(getLargeIconUri(window), callback);
return getPlaceholderBitmap();
}
return largeIcon;
}
@Nullable
@Override
public PendingIntent createCurrentContentIntent(Player player) {
int window = player.getCurrentWindowIndex();
return createPendingIntent(window);
}
}
플레이어에 연결은 다음과 같이 한다.
player = ExoPlayerFactory.newSimpleInstance(renderersFactory, trackSelector);
playerNotificationManager.setPlayer(player);
플레이어가 해제되기 전에 먼저 연결을 끊어야 한다.
playerNotificationManager.setPlayer(null);
player.release();
player = null;
커스텀하기
앱의 테마에 맞도록 알림을 커스텀하는 다양한 방법이 존재한다. 재생컨트롤의 동작여부를 설정하고 알림속성을 설정할 수 있도록 매니져가 기능을 제공한다. 이 속성들은 기본값을 가지고 있고 쉽게 바꿀수 있다.
재생컨트롤 액션들
기본 컨트롤액션을 제공한다. 재생/일시정지, FF/REW, Next/Previous, Stop등이 있으며 생략도 가능하다
// omit skip previous and next actions
playerNotificationManager.setUseNavigationActions(false);
// omit fast forward action by setting the increment to zero
playerNotificationManager.setFastForwardIncrementMs(0);
// omit rewind action by setting the increment to zero
playerNotificationManager.setRewindIncrementMs(0);
// omit the stop action
playerNotificationManager.setStopAction(null);
커스텀액션도 CustionActionReceiver를 확장하여 구현하여 PlayerNotificationManager 생성자의 5번째 파라메터로 넣어서 구현 가능하다.
알림 속성
알림매니저는 UI와 알림의 동작의 setter를 제공한다. 이는 NotificationCompat.Builder의 속성에 상응한다.
manager.setOngoing(false);
manager.setColor(Color.BLACK);
manager.setColorized(true);
manager.setUseChronometer(false);
manager.setSmallIcon(R.drawable.exo_notification_small_icon);
manager.setBadgeIconType(NotificationCompat.BADGE_ICON_NONE);
manager.setVisibility(NotificationCompat.VISIBILITY_PRIVATE);
MediaSession
최종적으로 Google Assistant등을 지원하기 위해 MediaSession API를 사용하고 있다면 media style 알림의 장점을 모두 취하기 위해 session에 token을 셋팅할수 있다.
playerNotificationManager.setMediaSessionToken(token);