Intro
안드로이드 앱을 개발하다 보면 다른 앱의 알림을 읽어야 하는 경우가 있습니다.
이번 시간에는 안드로이드에서 다른 앱의 알림을 읽어오는 방법에 대해 알아보도록 하겠습니다.
Notification Listener 서비스 생성
알림을 받아오기 위해 서비스를 생성해야 합니다.
아래의 코드를 직접 타이핑하거나, [New] - [Service] - [Service] 로 기본적인 코드를 생성하고 나머지만 작성하는 방법도 있습니다.
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.testapplication">
<application
...
<service
android:name=".MyNotificationListenerService"
android:enabled="true"
android:exported="false"
android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE">
<intent-filter>
<action android:name="android.service.notification.NotificationListenerService"/>
</intent-filter>
</service>
...
</application>
</manifest>
MyNotificationListenerService.kt
package com.example.testapplication
import android.app.Service
import android.content.Intent
import android.os.IBinder
import android.service.notification.NotificationListenerService
import android.service.notification.StatusBarNotification
import android.util.Log
class MyNotificationListenerService : NotificationListenerService() {
private val TAG = "MyNotificationListenerService"
override fun onNotificationPosted(sbn: StatusBarNotification?) {
super.onNotificationPosted(sbn)
Log.d(TAG, "onNotificationPosted")
}
}
권한 요청 및 확인
NotificationListener 서비스가 제대로 동작하려면 BIND_NOTIFICATION_LISTENER_SERVICE 권한을 획득해야 합니다.
하지만 해당 권한은 시스템 권한이라 앱에서 임의로 부여받을 수 없기 때문에 사용자가 직접 설정 창에서 권한을 부여하도록 해야 합니다.
MainActivity.kt
package com.example.testapplication
import android.app.NotificationManager
import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.os.Build
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.provider.Settings
import androidx.core.app.NotificationManagerCompat
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
if(!isNotificationPermissionGranted()) {
startActivity(Intent(Settings.ACTION_NOTIFICATION_LISTENER_SETTINGS))
}
}
private fun isNotificationPermissionGranted(): Boolean {
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
return notificationManager.isNotificationListenerAccessGranted(ComponentName(application, MyNotificationListenerService::class.java))
}
else {
return NotificationManagerCompat.getEnabledListenerPackages(applicationContext).contains(applicationContext.packageName)
}
}
}
Android API 27 (O_MR1) 이상의 버전은 NotificationManager 클래스의 isNotificationListenerAccessGranted 메서드를 호출하여 권한을 확인할 수 있습니다.
알림 읽기
알림 발생 시 onNotificationPosted 메서드가 호출됩니다. 이때 인자값으로 들어오는 sbn을 통해 알림의 내용을 확인할 수 있습니다.
MyNotificationListenerService.kt
class MyNotificationListenerService : NotificationListenerService() {
override fun onNotificationPosted(sbn: StatusBarNotification?) {
super.onNotificationPosted(sbn)
val packageName: String = sbn?.packageName ?: "Null"
val extras = sbn?.notification?.extras
val extraTitle: String = extras?.get(Notification.EXTRA_TITLE).toString()
val extraText: String = extras?.get(Notification.EXTRA_TEXT).toString()
val extraBigText: String = extras?.get(Notification.EXTRA_BIG_TEXT).toString()
val extraInfoText: String = extras?.get(Notification.EXTRA_INFO_TEXT).toString()
val extraSubText: String = extras?.get(Notification.EXTRA_SUB_TEXT).toString()
val extraSummaryText: String = extras?.get(Notification.EXTRA_SUMMARY_TEXT).toString()
Log.d(
TAG, "onNotificationPosted:\n" +
"PackageName: $packageName" +
"Title: $extraTitle\n" +
"Text: $extraText\n" +
"BigText: $extraBigText\n" +
"InfoText: $extraInfoText\n" +
"SubText: $extraSubText\n" +
"SummaryText: $extraSummaryText\n"
)
}
}
코드를 빌드하고 실행해보면 아래와 같이 알림의 내용이 정상적으로 들어오는 것을 확인할 수 있습니다.
질문이나 개선사항은 언제든지 댓글로 남겨주세요.
이상으로 포스팅을 마치겠습니다.
'Tips > Android' 카테고리의 다른 글
[Android] currentTimeMillis로 절대시간 구하기 (0) | 2022.05.03 |
---|---|
[Android] Binding 사용 시 모든 요소가 아무 동작도 안할 때 (0) | 2022.02.09 |
[Android] 오디오 모드 변경 및 볼륨 조절 (0) | 2022.02.07 |
[Android] Ringtone 재생 및 목록 가져오기 (0) | 2022.01.24 |
[Android] Quick Documentation 안뜨는 현상 해결법 (0) | 2021.12.23 |