본문 바로가기

안드로이드

다른 앱의 알림(Notification) 내용 가져오는 방법(알림 접근)

간혹 앱에서 다른 앱의 알림(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/reference/android/service/notification/NotificationListenerService.html

 

NotificationListenerService  |  Android 개발자  |  Android Developers

From class android.content.ContextWrapper void attachBaseContext(Context base) Set the base context for this ContextWrapper. boolean bindIsolatedService(Intent service, int flags, String instanceName, Executor executor, ServiceConnection conn) Variation of

developer.android.com

https://developer.android.com/guide/topics/manifest/permission-element

 

 |  Android 개발자  |  Android Developers

이 애플리케이션이나 다른 애플리케이션의 특정 구성요소 또는 기능에 대한 액세스를 제한하는 데 사용될 수 있는 보안 권한을 선언합니다. 권한 작동 방식에 관한 자세한 내용은 소개의 권한 섹션과 보안 및 권한 문서를 참조하세요.

developer.android.com