基于大模型的个人消费分析和理财助手:开发日志 4
功能开发
支付完成页面解析能力(重要更新)
实现基于无障碍服务的支付结果自动识别机制,当前已支持微信支付三类典型场景:
- 好友转账(TRANSFER)
- 商户支付(MERCHANT)
- 线下付款码支付
通过构建统一解析框架 BaseBillParser,实现解析逻辑解耦,并支持多平台扩展:
abstract class BaseBillParser {
abstract fun isMatched(rootNode: AccessibilityNodeInfo): Boolean
abstract fun parse(rootNode: AccessibilityNodeInfo): BillData?
}
在此基础上,实现微信解析器 WeChatParser,通过节点结构分析与文本定位提取关键账单信息:
val subjectCandidate = allTexts[successIndex + 1]
val amountCandidate = allTexts[successIndex + 2]
return BillData.Builder()
.platform(Platform.WeChat)
.amount(cleanAmount)
.subject(cleanSubject)
.timestamp(System.currentTimeMillis())
.scene(scene)
.build()
至于解析的具体逻辑,经过我们对微信支付的实际使用,分析出来,微信支付成功后会有以下页面结构(Android以 AccessibilityNodeInfo 树的方式提供给我们开发者):
[FrameLayout]
[LinearLayout]
[FrameLayout]
[LinearLayout] id:el
[FrameLayout] id:content
[FrameLayout] id:jlt
[FrameLayout] id:gda
[FrameLayout] id:jlt [Clickable]
[LinearLayout] id:kinda_main_container
[FrameLayout] id:kinda_status_bar_placeholder_view
[FrameLayout] id:container_layout
[LinearLayout] id:cg7
[ViewGroup]
[ViewGroup]
[ScrollView]
[ViewGroup] [Clickable]
[ViewGroup]
[ViewGroup] desc:"支付成功"
[ImageView]
[ViewGroup]
[TextView] text:"支付成功"
[ViewGroup]
[TextView] text:"待🍟确认收款"
[ViewGroup]
[TextView] text:"¥1.00"
[ViewGroup]
[ViewGroup]
[ViewGroup]
[Button] id:kinda_button_impl_wrapper desc:"完成" [Clickable]
[ImageView]
[TextView] text:"完成"
[View] id:navigationBarBackground
解析代码有点多,我们这里仅口述一下解析逻辑:
首先找到 describeContent 为“支付成功”的 ViewGroup 节点,然后获取该节点父节点的父节点 parent,然后通过递归算法,以 parent 为根,把所有找到的节点中的文本都加入一个 List<String>中,通过解析这个 List 来实现支付具体信息的识别(收款对象、收款金额、支付场景等等)
账单数据模型标准化(数据层重构)
引入独立数据模型 BillData,统一描述账单核心字段:
- 金额(amount)
- 交易对象(subject)
- 时间戳(timestamp)
- 平台(platform)
- 场景(scene)
支持 Parcelable,实现跨组件传递:
class BillData() : Parcelable {
var amount: String = ""
var subject: String = ""
var timestamp: Long = 0L
var platform: Platform = Platform.Unknown
var scene: Scene = Scene.Unknown
}
同时引入 Builder 模式,提升构建过程的可读性与扩展性。
屏幕识别服务控制能力(跨端通信增强)
扩展 Flutter 与原生通信接口(Pigeon),新增:
- 启动服务
- 停止服务
- 查询服务状态
interface AccessibilityManager {
fun startForegroundService()
fun stopForegroundService(callback: (Result<Unit>) -> Unit)
fun checkForegroundService(): Boolean
}
原生侧实现服务状态检测逻辑:
val enabledServices = am.getEnabledAccessibilityServiceList(...)
return enabledServices.any {
it.resolveInfo.serviceInfo.packageName == activity.packageName
}
Flutter 层新增设置项,实现用户对“屏幕识别服务”的显式控制,提升系统可控性与用户透明度。
新增账单展示页面(UI 完善)
引入 BillBottomSheetActivity,基于半透明 Activity 实现账单弹窗展示:
- 支持底部滑入动画
- 支持背景渐变暗化
- 数据动态绑定
bottomSheetCard.animate()
.translationY(0f)
.setDuration(300)
.setInterpolator(DecelerateInterpolator())
.start()
相比传统悬浮窗方案,该实现更符合系统窗口管理机制。
Bug 修复
悬浮窗被覆盖问题修复(关键稳定性问题)
原实现基于 WindowManager 添加悬浮窗,在部分场景下被微信界面覆盖。
调整为使用独立半透明 Activity 承载 UI:
startActivity(Intent(this, BillBottomSheetActivity::class.java).apply {
setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
})
解决了悬浮层级冲突问题
权限状态与 UI 不一致问题修复
修复权限页与设置页状态不同步问题,通过状态集中管理(GetX)实现一致性:_appSettingsController.hasOverlayPermission.value = true;
确保权限变更实时反映
性能优化
无障碍事件节流机制
引入时间节流限制,避免高频事件导致性能问题:
if (currentTime - lastAnalyzeTime < 500) return
降低 CPU 消耗,防止重复解析,提升低端设备稳定性
Accessibility 配置优化
调整事件通知间隔:
android:notificationTimeout="300"
减少系统回调频率,降低整体负载。
内存与资源管理优化
在节点遍历中显式释放资源,避免潜在内存泄漏:
child.recycle()
文档 / 维护
代码结构重构
将 BillData 从 Service 中解耦
移除冗余 BillDialogData
明确分层结构(model / parser / service / view)
服务生命周期管理完善
新增:
Service 单例引用管理
停止回调机制
广播控制关闭能力
fun stopService() {
instance?.disableSelf()
instance?.stopSelf()
}
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)