반응형
Jetpack Compose에서 알림 권한 요청과 알림 표시하기
Android 13(Tiramisu, API 33) 이상에서는 사용자가 알림을 수신하기 전에 POST_NOTIFICATIONS 권한을 요청해야 합니다. Jetpack Compose를 사용하여 권한을 확인하고 요청하는 방법을 알아보겠습니다.
1. 프로젝트 설정
먼저, build.gradle 파일에 필요한 의존성을 추가합니다:
dependencies {
implementation "androidx.core:core-ktx:1.9.0"
implementation "androidx.compose.ui:ui:1.3.3"
implementation "androidx.compose.material:material:1.3.1"
implementation "androidx.compose.ui:ui-tooling-preview:1.3.3"
implementation "androidx.activity:activity-compose:1.6.1"
}
2. 권한 확인 및 요청
다음은 Jetpack Compose를 사용하여 POST_NOTIFICATIONS 권한을 확인하고 요청하는 예제입니다:
import android.Manifest
import android.content.pm.PackageManager
import android.os.Build
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.result.contract.ActivityResultContracts
import androidx.compose.foundation.layout.*
import androidx.compose.material.Button
import androidx.compose.material.Text
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import androidx.core.content.ContextCompat
import androidx.core.content.PermissionChecker
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
RequestNotificationPermission()
}
}
@Composable
fun RequestNotificationPermission() {
val permissionState = remember { mutableStateOf(checkNotificationPermission()) }
val requestPermissionLauncher =
rememberLauncherForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted ->
permissionState.value = isGranted
}
if (permissionState.value) {
Text("Notification permission granted")
} else {
Column(
modifier = Modifier.fillMaxSize(),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Center
) {
Text("Notification permission is required")
Spacer(modifier = Modifier.height(16.dp))
Button(onClick = {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
requestPermissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS)
}
}) {
Text("Request Permission")
}
}
}
}
private fun checkNotificationPermission(): Boolean {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED
} else {
true
}
}
}
3. 알림 생성 및 표시
권한을 얻은 후, 알림을 생성하고 표시하는 방법을 살펴보겠습니다:
import android.app.NotificationChannel
import android.app.NotificationManager
import android.os.Build
import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat
fun showNotification(context: Context) {
// 알림 채널 설정 (Android 8.0 이상)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val channelId = "your_channel_id"
val channelName = "Your Channel Name"
val importance = NotificationManager.IMPORTANCE_DEFAULT
val channel = NotificationChannel(channelId, channelName, importance).apply {
description = "Your Channel Description"
}
val notificationManager: NotificationManager = context.getSystemService(NotificationManager::class.java)
notificationManager.createNotificationChannel(channel)
}
// 알림 생성
val builder = NotificationCompat.Builder(context, "your_channel_id")
.setSmallIcon(R.drawable.notification_icon)
.setContentTitle("Your Notification Title")
.setContentText("Your Notification Content")
.setPriority(NotificationCompat.PRIORITY_HIGH)
// 알림 표시
with(NotificationManagerCompat.from(context)) {
notify(1, builder.build())
}
}
결론
이 글에서는 Jetpack Compose를 사용하여 Android 13 이상에서 POST_NOTIFICATIONS 권한을 요청하고 알림을 표시하는 방법을 알아보았습니다. 권한 관리와 알림 생성은 사용자 경험을 향상시키는 중요한 요소입니다. 이를 통해 더 나은 사용자 경험을 제공할 수 있습니다.
반응형
'모바일 앱(안드로이드)' 카테고리의 다른 글
Google Cloud Translate V2 을 활용해서 strings.xml 을 번역해 보겠습니다. (3) | 2025.02.07 |
---|---|
Jetpack Compose를 사용하여 AdMob 배너 광고 추가하기 (0) | 2025.02.01 |
Android Studio를 사용하여 Google Maps 연동 앱 만들기 (1) | 2025.01.30 |
Jetpack Compose 에서 dialog을 이용해 비밀번호 입력 화면 구성해 보기 (0) | 2025.01.27 |
Android studio 의 AVD의 화면은 왜 블랙 스크린이 되는 걸까 ? (3) | 2025.01.22 |