功能开发

支付完成页面解析能力(重要更新)

实现基于无障碍服务的支付结果自动识别机制,当前已支持微信支付三类典型场景:

  • 好友转账(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()
}
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐