간혹 앱에서 다른 앱의 알림(Notification)에 접근해야 하는 경우가 생긴다. 이 때 사용하는 클래스가 NotificationListenerService 이며, 해당 클래스를 구현해서 사용한다. 해당 클래스는 Service이기 때문에 AndroidManifest에 등록 후 사용해야 한다. permission으로는 android.permission.BIND_NOTIFICATION_LISTENER_SERVICE을 부여해줘야 하는데 해당 권한은 'signature'로 시스템에서 부여하는 권한으로 앱에서 임의로 권한을 획득할 수 없고, 사용자가 설정에서 부여해줘야 한다.
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="...">
<application
...
<service
android:name=".MyNotificationListener"
android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE">
<intent-filter>
<action android:name="android.service.notification.NotificationListenerService"/>
</intent-filter>
</service>
...
</application>
</manifest>
MyNotificationListenerService.kt
import android.service.notification.NotificationListenerService
import android.service.notification.StatusBarNotification
import android.util.Log
class MyNotificationListenerService: NotificationListenerService() {
override fun onListenerConnected() {
super.onListenerConnected()
Log.e("kobbi","MyNotificationListener.onListenerConnected()")
}
override fun onListenerDisconnected() {
super.onListenerDisconnected()
Log.e("kobbi","MyNotificationListener.onListenerDisconnected()")
}
override fun onNotificationPosted(sbn: StatusBarNotification?) {
super.onNotificationPosted(sbn)
sbn?.packageName?.run {
Log.e("kobbi","MyNotificationListener.onNotificationPosted() --> packageName: $this")
}
}
}
해당 클래스의 주요 메서드는 다음과 같다.
onListenerConnected() : 서비스가 연결(실행)되었을 때 콜백되는 메서드이다. 앱이 최초에 실행되거나, 알림 접근 권한을 획득하게 되면 호출된다.
onListenerDisconnected() : 서비스가 연결 해제되었을 때 콜백되는 메서드이다.
onNotificationPosted(sbn: StatusBarNotification) : 알림이 왔을 때 콜백되는 메서드이다. StatusBarNotification 객체에 해당 알림에 대한 정보가 들어있으며, 객체 내부 getNotification() 메서드로 알림에 대한 정보를 획득할 수 있다.
onNotificationRemoved(dbn: StatusBarNotification) : 알림이 삭제되었을 때 콜백되는 메서드이다.
서비스 구현이 끝났으면, 아래와 같이 사용자에게 알림 접근 허용에서 서비스할 앱(본인 앱)을 선택하여 권한을 부여해주면 된다.
알림 접근 허용으로 넘어가는 방법
...
if (!isNotificationPermissionAllowed())
startActivity(Intent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS"));
/**
* Notification 접근 권한 체크 메서드
* @return 접근권한이 있을 경우 true, 아니면 false
*/
private fun isNotificationPermissionAllowed(): Boolean {
return NotificationManagerCompat.getEnabledListenerPackages(applicationContext)
.any { enabledPackageName ->
enabledPackageName == packageName
}
}
...
참고 자료
https://developer.android.com/guide/topics/manifest/permission-element
'안드로이드' 카테고리의 다른 글
Android EditText 입력창(SoftInput) 숨기는 방법 (0) | 2020.03.16 |
---|---|
Android Asset 활용하기 (0) | 2020.03.10 |
RxJava - (1) 소개 및 초기 설정 (0) | 2020.02.25 |
기상청 API 변경사항 적용 및 후기 (0) | 2020.02.12 |
안드로이드 카메라, 갤러리 연동 (1) | 2020.01.09 |