[android : kotlin] 코틀린 Notification setShowActionsInCompactView 사용 예제 : MediaStyle
미디어 스타일 설정시 setShowActionsInCompactView에 대해 알아본다. 미디어 스타일(MediaStyle) 사용시 setShowActionsInCompactView에 대한 값을 설정해야한다. setShowActionsInCompactView는 Notification이 접혔을 때 보여질 addAcion의 아이콘을 설정하는 것이다. 기준은 addAcion이 된다. addAction이 5개라고 했을 때
setShowActionsInCompactView(0,1,2,3,4) 로 설정할 수 있다. 인덱스 값은 0부터 시작된다. 이렇게 설정하면 Notification이 무조건 펼쳐진 상태로 노출된다. 감춰야할 버튼이 없기 때문이다. setShowActionsInCompactView(0,1,2) 으로 설정하게되면 Notification이 접혔을 때 보여질 버튼이 3개만 보여지게되는 것이다. 아래 노티가 펼쳐졌을때와 접혔을때를 참고 하면 이해가 될 것이다.
Notification에 보여질 아이콘을 추가하기 위해 addAction()사용하여 추가해보자.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val builder = NotificationCompat.Builder(this, CHANNEL_ID)
.setContentTitle(description.title)
.setContentText(description.subtitle)
.setSubText(description.description)
// Show controls on lock screen even when user hides sensitive content.
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
.setAutoCancel(false)
//.setWhen(System.currentTimeMillis())
.setContentIntent(controller.sessionActivity)
.setSmallIcon(R.mipmap.ic_launcher_round)
.setLargeIcon(description.iconBitmap)
.setDeleteIntent(
MediaButtonReceiver.buildMediaButtonPendingIntent(
this,
PlaybackStateCompat.ACTION_STOP
)
)
//.setWhen(System.currentTimeMillis())
.setStyle(
androidx.media.app.NotificationCompat.MediaStyle()
.setMediaSession(sessionToken)
.setShowActionsInCompactView(
0,
1,
2
)
.setShowCancelButton(true)
.setCancelButtonIntent(
MediaButtonReceiver.buildMediaButtonPendingIntent(
this, PlaybackStateCompat.ACTION_STOP
)
)
)
//.setColor(ContextCompat.getColor(this, R.color.colorAccent))
.setShowWhen(false)
.setPriority(NotificationCompat.PRIORITY_HIGH)
.setOnlyAlertOnce(true)
.setChannelId(CHANNEL_ID)
.build()
}
아래 코드스니펫을 보자. Notificaiotn.action를 사용해서 PendingIntent를 설정해야한다.
val previous =
Notification.Action.Builder(
R.drawable.baseline_skip_previous_24,
getString(R.string.previous),
MediaButtonReceiver.buildMediaButtonPendingIntent(
this,
PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS
)
).build()
val next =
Notification.Action.Builder(
R.drawable.baseline_skip_next_24,
getString(R.string.next),
MediaButtonReceiver.buildMediaButtonPendingIntent(
this,
PlaybackStateCompat.ACTION_SKIP_TO_NEXT
)
).build()
lateinit var playpause: Notification.Action
if(playbackState == PlaybackStateCompat.STATE_PLAYING) {
playpause =
Notification.Action.Builder(
R.drawable.baseline_pause_circle_outline_24,
getString(R.string.pause),
MediaButtonReceiver.buildMediaButtonPendingIntent(
this,
PlaybackStateCompat.ACTION_PLAY_PAUSE
)
).build()
} else {
playpause =
Notification.Action.Builder(
R.drawable.baseline_play_circle_outline_24,
getString(R.string.play),
MediaButtonReceiver.buildMediaButtonPendingIntent(
this,
PlaybackStateCompat.ACTION_PLAY_PAUSE
)
).build()
}
actions 배열을 초기화 후 각각 인덱스 번호를 지정 후 배열에 넣어주자.
//var btnActions: Array<Notification.Action> = emptyArray<Notification.Action>()
var btnActions: Array<Notification.Action?> = arrayOfNulls<Notification.Action>(3)
btnActions[0] = previous
btnActions[1] = playpause
btnActions[2] = next
builder.actions = btnActions
[build.gradle(:app)]
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
android {
compileSdkVersion 29
defaultConfig {
applicationId "edu.kotlin.study"
minSdkVersion 22
targetSdkVersion 29
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: "libs", include: ["*.jar"])
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation 'androidx.core:core-ktx:1.3.1'
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.1'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
}
[REFERENCE]
stackoverflow.com/questions/35647821/android-notification-addaction-deprecated-in-api-23
[연관 글 더보기]
[프로그래밍/Kotlin] – [android : kotlin] 코틀린 Notification addAction 추가하는 방법 : Notification.Action.Builder
[프로그래밍/Kotlin] – [android : kotlin] 코틀린 Notification 사용 예제
[프로그래밍/Android] – 잠금화면에 알림내용(NotificationCompat) 노출하기 (to show content in lock screen