让代码更简单

Android实现监听系统通知栏信息

重要:本文最后更新于2024-09-23 20:45:41,某些文章具有时效性,若有错误或已失效,请在下方留言或联系代码狗

今天在看别人帖子的时候,发现很久前看到的一篇通过安卓软件监听支付宝和微信的收款通知消息,实现支付宝和微信支付的免签约,支付回调功能。突然想自己试试实现过程,曾经使用hook实现过PC端的微信支付收款回调,详见:易语言HOOK微信实现个人免签支付

由于安卓全面使用kotlin语言,本次实验代码由chatgpt提供,实测通过。

实现原理是通过Android系统提供的api读取系统通知栏,获取其中的数据。所以创建一个名为MyNotificationListener的类,来开启服务,实现监听。

复制
package com.example.testnotifycation

import android.service.notification.NotificationListenerService
import android.service.notification.StatusBarNotification
import android.util.Log

class MyNotificationListener : NotificationListenerService() {

override fun onNotificationPosted(sbn: StatusBarNotification?) {
sbn?.let {
val notification = it.notification
val extras = notification.extras
for (key in extras.keySet()) {
Log.d("NotificationListener", "Key: $key, Value: ${extras.get(key)}")
}

// 检查通知是否为群组通知头部
if (extras.getBoolean("android.isGroupHeader", false)) {
Log.d("NotificationListener", "群组通知头部,不包含具体内容。")
return
}

// 尝试获取标题和内容
val title = extras.getString("android.title")
val text = extras.getCharSequence("android.text")?.toString()

// 如果标题或内容缺失,处理其他字段
if (title.isNullOrEmpty() && text.isNullOrEmpty()) {
// 使用其他可能的字段
val tickerText = notification.tickerText?.toString()
val bigText = extras.getCharSequence("android.bigText")?.toString()

Log.d("NotificationListener", "获取到的通知: ticker: $tickerText, bigText: $bigText")
} else {
// 成功获取标题和内容
Log.d("NotificationListener", "通知标题: $title, 内容: $text")
}
}
}


override fun onNotificationRemoved(sbn: StatusBarNotification?) {
Log.d("NotificationListener", "通知被移除: ${sbn?.packageName}")
}
}

然后在AndroidManifest.xml中添加权限以及声明你的NotificationListenerService

复制
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.yourapp">

<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>

<!-- 请求监听通知的权限 -->
<uses-permission android:name="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE" />

</manifest>

注意:要想读取系统通知栏信息,需要授权,可以使用如下代码检查是否获取了该权限,如果没有就跳转到授权页面,引导用户授权。

复制
import android.content.Context
import android.content.Intent
import android.provider.Settings
import android.widget.Toast

fun requestNotificationPermission(context: Context) {
if (!isNotificationServiceEnabled(context)) {
context.startActivity(Intent(Settings.ACTION_NOTIFICATION_LISTENER_SETTINGS))
Toast.makeText(context, "请启用通知访问权限", Toast.LENGTH_LONG).show()
} else {
Toast.makeText(context, "通知访问权限已启用", Toast.LENGTH_LONG).show()
}
}

private fun isNotificationServiceEnabled(context: Context): Boolean {
val enabledListeners = Settings.Secure.getString(context.contentResolver, "enabled_notification_listeners")
val packageName = context.packageName
return enabledListeners != null && enabledListeners.contains(packageName)
}

在合适的位置调用requestNotificationPermission进行权限检查即可。

通过Android Studio的logcat可以看到,成功捕获通知信息。

Android实现监听系统通知栏信息

感觉很棒!可以赞赏支持我哟~

0 打赏

评论 (0)

登录后评论
QQ咨询 邮件咨询 狗哥推荐