今天在看别人帖子的时候,发现很久前看到的一篇通过安卓软件监听支付宝和微信的收款通知消息,实现支付宝和微信支付的免签约,支付回调功能。突然想自己试试实现过程,曾经使用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可以看到,成功捕获通知信息。
评论 (0)