Skip to content

Repository files navigation

提醒宝 (SmartNotify)

提醒宝 是一款安卓短信强提醒应用,针对特定号码或特定内容的短信,以长铃声、振动、闪光灯、全屏弹窗等方式进行强提醒,帮助用户及时发现挪车短信、贴条短信、违章提醒等重要短信。

License: MIT Android Kotlin


项目简介

提醒宝 是一款 Android 端消息强提醒应用(短信强提醒是其核心能力)。它监听短信(同时支持部分应用通知),当发送方号码或消息内容命中用户设定的规则时,立即触发类似闹钟的长铃声 + 持续振动 + 闪光灯爆闪 + 全屏弹窗组合提醒,直到用户点击“我已知晓”才会停止,彻底解决“手机静音 / 勿扰模式下错过挪车短信、贴条短信、违章提醒”的问题。

本应用体积小巧、无广告、无联网请求,所有配置与日志均保存在本地,适合对隐私敏感的用户自用。

测试环境:小米 HyperOS(Android 15 / 16)、Pixel 原生 Android 等。


功能特性

  • 短信强提醒:监听特定号码(如交警 12123)或内容关键词(如“挪车”“贴条”“违停”“立即驶离”),命中后触发强提醒。
  • 应用通知强提醒:支持对指定应用(如地图、银行、社区 App)的通知进行同样的强提醒,适用于更多高优先级通知场景。
  • 自定义规则
    • 号码管理:精确号码或短号匹配,兼容运营商前缀。
    • 关键词管理:可配置多个关键词,短信内容包含任一关键词即触发。
    • 应用管理:选择需要监听的 App,并可为不同应用设置不同规则。
  • 多种提醒方式:仅铃声 / 仅振动 / 铃声 + 振动,并可叠加闪光灯爆闪(需相机权限)。
  • 自定义铃声:通过系统铃声选择器选择任意铃声,默认使用闹钟音频流突破静音/勿扰。
  • 全屏弹窗 + 锁屏唤醒:强提醒界面可在锁屏上直接显示,并点亮屏幕、保持屏幕常亮。
  • 持续循环提醒:未确认前铃声与振动循环播放,不会只响一次就消失。
  • 后台保活:使用 specialUse 前台服务 + 开机自启(BootReceiver)+ 电池优化白名单,降低被系统回收的概率。
  • 突破静音/勿扰:铃声走 STREAM_ALARM 音频流,默认可突破静音与勿扰模式(部分系统需额外关闭“勿扰屏蔽闹钟”)。
  • 极小体积:仅依赖必要的 AndroidX 库,目标 APK 2-4 MB。
  • 本地运行:所有数据、日志、配置均保存在本地,不上传任何信息。

示例截图

截图文件位于项目目录 image/

全屏强提醒 配置中心
全屏强提醒 配置中心

截图说明

  • 左图:命中规则后弹出的全屏强提醒界面,显示发送方号码(121234101)与短信内容,底部提供“我已知晓”按钮,只有点击后才会停止铃声与振动。
  • 右图:应用主配置页,可管理监听号码、关键词、提醒方式(铃声+振动)、闪光灯开关,以及选择自定义铃声。底部导航支持“首页 / 短信提醒 / 应用提醒”三大模块。

安装与使用

方式一:直接安装预编译 APK(推荐)

  1. 下载本仓库中的预编译安装包:
  2. 将 APK 拷贝到 Android 手机。
  3. 在手机上点击安装,若提示“未知来源”请在设置中允许安装未知来源应用。
  4. 打开应用,按提示完成权限与保活设置(见下文)。

方式二:从源码构建

环境要求

版本/要求
JDK 17+
Android SDK API 35 (Android 15)
Build Tools 35.0.0
Gradle 8.9
Android Gradle Plugin 8.7.3
Kotlin 2.0.21

1. 安装 JDK 17

下载 Eclipse Temurin 17 并配置环境变量:

JAVA_HOME = C:\Program Files\Eclipse Adoptium\jdk-17.0.11.x-hotspot
Path 追加:%JAVA_HOME%\bin

验证:

java -version
# 应输出 openjdk version "17.x.x"

2. 安装 Android SDK

推荐安装 Android Studio Koala 2024.1.1+,并在 SDK Manager 中安装:

  • SDK Platform 35 (Android 15)
  • Build-Tools 35.0.0
  • Platform-Tools
  • Command-line Tools (latest)

配置环境变量(Windows 示例):

ANDROID_HOME = C:\Users\<用户名>\AppData\Local\Android\Sdk
Path 追加:
  %ANDROID_HOME%\platform-tools
  %ANDROID_HOME%\cmdline-tools\latest\bin
  %ANDROID_HOME%\build-tools\35.0.0

3. 配置 local.properties

在项目根目录创建 local.properties,写入你的 SDK 路径(注意转义):

sdk.dir=C\:\\Users\\<用户名>\\AppData\\Local\\Android\\Sdk

4. 构建 Release APK

项目已配置 gradle/wrapper/gradle-wrapper.properties,使用腾讯云镜像,首次构建会自动下载 Gradle 8.9。

首次构建前,请确认项目根目录存在 gradlew / gradlew.batgradle/wrapper/gradle-wrapper.jar 如果缺失(例如从仓库直接 clone),可通过以下任一方式生成:

  • 方式 A(推荐):用 Android Studio 打开项目,Gradle Sync 会自动生成 Wrapper 脚本。
  • 方式 B:如果本机已安装 Gradle 8.9+,在项目根目录执行:
    gradle wrapper

生成 Wrapper 后执行构建:

# Windows
gradlew.bat assembleRelease

# Linux / Mac
./gradlew assembleRelease

产物路径:app/build/outputs/apk/release/app-release.apk

当前 Release 配置使用 Debug 签名,可直接安装调试。如需正式签名,参考 app/build.gradle.kts 配置 signingConfigs

5. 安装到设备

adb devices                    # 确认设备已连接
adb install -r app\build\outputs\apk\release\app-release.apk

配置方法

首次安装后,必须完成以下配置,强提醒才能正常工作(尤其是 HyperOS / MIUI 系统)。

1. 授予必要权限

打开应用后,按引导或在“首页”逐项授权:

权限项 说明
短信权限 监听新短信;若开关灰色,请前往应用信息 → 右上角菜单 → 允许受限设置
通知使用权 监听应用通知(应用提醒功能需要)
通知权限 强提醒通知与前台服务通知
电池优化白名单 防止系统后台回收
全屏通知(FSI) 锁屏时弹出全屏提醒界面
相机权限 闪光灯爆闪提醒(可选)
自启动 / 后台弹窗 HyperOS 需手动开启,否则锁屏/后台无法弹提醒

2. 设置特定号码匹配规则

  1. 进入“短信提醒”标签页。
  2. 点击 号码管理 → 编辑
  3. 输入需要监听的号码,例如:
    • 12123(交警服务号)
    • 121234101(地方性交警短信平台)
  4. 保存后,来自这些号码的短信将触发强提醒。

号码匹配规则:系统会自动去除发送号码中的 +86、空格、短横线等,随后以配置号码结尾进行匹配,兼容运营商前置前缀。

3. 设置内容关键词匹配规则

  1. 在同一页面点击 关键词管理 → 编辑
  2. 输入需要监听的关键词,例如:
    • 挪车
    • 贴条
    • 违停
    • 立即驶离
    • 拖车
  3. 保存后,短信正文包含任一关键词即触发强提醒。

匹配规则:大小写不敏感,命中“号码规则”或“关键词规则”中的任意一项即触发。

4. 设置提醒方式与铃声

  • 提醒方式:选择“铃声 + 振动”或“仅铃声”/“仅振动”。
  • 闪光灯:开启后,触发时摄像头闪光灯会跟随节奏爆闪。
  • 提醒铃声:点击“选择”,从系统铃声中选择喜爱的音频;未选择或失效时自动回退到系统默认闹钟铃声。

5. 测试强提醒

配置完成后,点击 测试强提醒 按钮:

  • 屏幕应点亮并弹出全屏提醒界面。
  • 铃声应循环播放。
  • 振动应持续。
  • 点击“我已知晓”后,铃声与振动应立即停止。

技术实现说明

技术栈

选择
语言 Kotlin
最低 SDK Android 10 (API 29)
目标 SDK Android 15 (API 35)
编译 SDK Android 15 (API 35)
UI ViewBinding + Material3 浅色主题
存储 Preferences DataStore
前台服务 specialUse(不受 Android 15 BOOT_COMPLETED 限制)
构建工具 Gradle 8.9 + AGP 8.7.3 + Kotlin 2.0.21

项目结构

smartnotify/
├── LICENSE                       # MIT 开源许可证
├── README.md                     # 本文件
├── settings.gradle.kts           # 单模块项目设置(含国内镜像)
├── build.gradle.kts              # 根构建文件
├── gradle.properties             # Gradle 配置
├── gradle/wrapper/               # Gradle Wrapper 配置
├── local.properties              # 本地 SDK 路径(自行创建,不提交)
├── app-release.apk               # 根目录预编译 APK(可选)
├── release/
│   └── app-release.apk           # 推荐下载的预编译 Release APK
├── image/
│   ├── SMS强提醒.jpg             # 示例截图 1
│   └── SMS强提醒配置.jpg         # 示例截图 2
└── app/
    ├── build.gradle.kts          # 应用模块构建配置
    ├── proguard-rules.pro        # ProGuard 规则
    └── src/main/
        ├── AndroidManifest.xml
        ├── kotlin/com/example/smartnotify/
        │   ├── SmsAlertApp.kt                # Application 入口
        │   ├── MainActivity.kt               # 主界面(BottomNavigation)
        │   ├── ui/                           # UI 辅助与 Fragment
        │   │   ├── HomeFragment.kt
        │   │   ├── SmsAlertFragment.kt
        │   │   ├── AppAlertFragment.kt
        │   │   ├── StringListDialog.kt
        │   │   ├── AppAlertEditorDialog.kt
        │   │   ├── AppPickerDialog.kt
        │   │   ├── RingtonePickerHelper.kt
        │   │   └── DebugLogActivity.kt
        │   ├── receiver/
        │   │   ├── SmsReceiver.kt            # 短信接收广播
        │   │   ├── SmsDatabaseObserver.kt    # 短信数据库变化监听
        │   │   └── BootReceiver.kt           # 开机自启
        │   ├── service/
        │   │   ├── AlertForegroundService.kt # specialUse 前台服务
        │   │   └── NotificationMonitor.kt    # 通知监听服务
        │   ├── alert/
        │   │   ├── AlertActivity.kt          # 全屏提醒界面
        │   │   ├── AlertController.kt        # 提醒流程编排
        │   │   ├── AlertPlayer.kt            # 铃声 + 振动播放器
        │   │   ├── AlertNotifier.kt          # 强提醒通知
        │   │   └── AlertFlash.kt             # 闪光灯控制
        │   ├── logic/
        │   │   ├── SmsMatcher.kt             # 短信规则匹配
        │   │   └── AppAlertMatcher.kt        # 应用通知规则匹配
        │   ├── data/
        │   │   ├── AlertConfig.kt            # 配置数据模型
        │   │   ├── AppAlertRule.kt           # 应用规则模型
        │   │   └── PreferencesManager.kt     # DataStore 封装
        │   └── util/
        │       ├── PermissionHelper.kt       # 权限申请辅助
        │       ├── HyperOsHelper.kt          # HyperOS 私有权限引导
        │       ├── DebugLogBuffer.kt         # 调试日志缓冲
        │       └── LogcatReader.kt           # 日志读取
        └── res/                              # 布局 / 图标 / 主题 / 字符串

核心流程

短信监听流程

短信到达 → 系统发送 SMS_RECEIVED 广播
  → SmsReceiver(高优先级)接收
  → 解析发送方号码 + 短信正文
  → 从 DataStore 读取配置
  → SmsMatcher 匹配号码列表 / 关键词列表
  → 命中:startForegroundService(AlertForegroundService)

部分机型还会通过 SmsDatabaseObserver 监听短信数据库变化,作为 SMS 广播的兜底方案。

应用通知监听流程

应用发出通知 → NotificationMonitor(NotificationListenerService)捕获
  → 解析通知来源包名 + 标题 + 内容
  → AppAlertMatcher 匹配规则
  → 命中:startForegroundService(AlertForegroundService)

强提醒触发流程

AlertForegroundService.onStartCommand(ACTION_TRIGGER_ALERT)
  → startForeground(specialUse)         // 持有前台通知,降低被杀概率
  → acquire WakeLock                     // 保持 CPU 运转
  → AlertController.triggerAlert()
      → AlertPlayer.start()              // MediaPlayer(USAGE_ALARM, looping) + Vibrator(循环波形)
      → AlertFlash.start()               // 闪光灯爆闪(可选)
      → startActivity(AlertActivity)     // 全屏界面,锁屏可显示 + 点亮屏幕
      → AlertNotifier.notifyAlert()      // 强提醒通知(含 fullScreenIntent)

用户停止流程

AlertActivity [点击“我已知晓”]
  → startService(ACTION_STOP_ALERT)
  → AlertController.stopAlert()          // 停止 MediaPlayer + Vibrator + Flash
  → 取消强提醒通知
  → release WakeLock
  → stopForeground + stopSelf

匹配规则说明

  • 号码匹配:发送方号码去除 +86、空格、短横线后,若以配置号码结尾即命中,可兼容不同地区运营商前缀。
  • 关键词匹配:短信正文或通知内容包含任一关键词(不区分大小写)即命中。
  • 触发条件:命中号码规则 关键词规则中的任意一项即触发。

后台保活机制

  • 前台服务specialUse 类型,持有低重要性常驻通知,系统默认不杀。
  • 开机自启BootReceiver 监听 BOOT_COMPLETEDspecialUse 不受 Android 15 对侧载应用后台启动的限制。
  • START_STICKY:服务被异常终止后,系统会尝试重建。
  • WakeLock:提醒期间保持 CPU 唤醒,30 分钟超时兜底,防止泄漏。
  • 电池优化白名单:引导用户将应用加入白名单,避免被系统省电策略冻结。

限制与注意事项

  1. Android 15 SMS 权限为 hard-restricted:侧载 APK 必须引导用户前往“应用信息 → 允许受限设置”,无法通过代码绕过。
  2. HyperOS 前台服务非万能:极端省电模式仍可能冻结服务,必须设置“省电策略 = 无限制”。
  3. 后台弹窗权限是关键:缺失时锁屏/后台无法启动 AlertActivity,会降级为 heads-up 通知。
  4. 自定义铃声 URI 持久化权限:清除应用数据或重装后,自定义铃声可能失效,代码会自动回退到系统默认闹钟铃声。
  5. 勿扰模式USAGE_ALARM 默认可突破 DND,但 HyperOS“勿扰屏蔽闹钟”开启时仍会被屏蔽。
  6. BootReceiver 延迟:开机后系统可能延迟数分钟送达 BOOT_COMPLETED,开机后短期内可能无法监听。
  7. 隐私与安全:短信与通知内容涉及个人隐私,请仅在自有设备上使用,不要转发或收集他人短信。

开源许可证

本项目基于 MIT 许可证 开源。

MIT License

Copyright (c) 2026 SmartNotify Contributors

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
...

你可以自由使用、修改、分发本软件,但请保留原始许可证声明。作者不对使用本软件造成的任何损失负责。


贡献与反馈

欢迎提交 Issue 与 PR。如果你有任何改进建议(如适配更多机型、优化保活策略、修复 Bug 等),请通过 GitHub Issues 讨论。

提示:本项目主要面向个人自用场景,请遵守当地法律法规,不要用于监听他人隐私或骚扰他人。

About

No description or website provided.

Topics

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages