一个简洁高效的 Android 应用,自动拦截不在通讯录中的陌生来电,并发送自动回复短信。
- 🚫 自动拦截陌生来电 - 不在通讯录的号码直接拦截,不响铃、不显示
- 📱 智能识别 - 基于系统通讯录和自定义白名单判断
- 💬 自动短信回复 - 拦截后自动发送预设短信告知对方
- 📝 自定义模板 - 可编辑短信回复内容
- 📊 拦截记录 - 保存所有被拦截的来电历史
- ⚪ 白名单管理 - 支持添加例外号码
- 🎨 Material 3 设计 - 现代化的用户界面
- 最低版本: Android 7.0 (API 24)
- 目标版本: Android 15 (API 35)
- 推荐设备: 真机(模拟器可能不支持来电筛选功能)
- 下载最新版本的 APK
- 在手机上安装
- 打开应用并按照引导完成权限设置
应用需要以下权限才能正常工作:
-
来电筛选角色 ⭐ 核心权限
- 用途:拦截来电
- 设置:应用内点击"授权"按钮
-
读取通讯录
- 用途:判断来电号码是否为联系人
- 设置:运行时权限,应用内申请
-
发送短信
- 用途:自动回复被拦截的号码
- 设置:运行时权限,应用内申请
- 打开应用
- 点击权限卡片中的"授权"按钮,依次授予所有权限
- 开启"启用拦截功能"开关
- (可选)编辑短信模板
- 完成!现在陌生来电会被自动拦截
来电 → CallScreeningService 拦截
↓
查询白名单(Room 数据库)
↓
查询通讯录(ContactsContract)
↓
判断是否陌生号码?
├─ 是 → 拦截 + 记录 + 发短信
└─ 否 → 允许通过(正常响铃)
被拦截的来电:
- ✅ 手机不会响铃
- ✅ 屏幕不会显示来电界面
- ✅ 不会有未接来电通知
- ✅ 不会在通话记录中留下痕迹(Android 10+)
对方体验:
- 听到"您拨打的电话正在通话中"或转到语音信箱
- 收到自动回复短信(如果启用)
- 语言: Kotlin 2.0.21
- UI 框架: Jetpack Compose + Material 3
- 数据库: Room 2.6.1
- 架构: 单 Activity + Service 架构
- 异步处理: Kotlin Coroutines
- 构建工具: Gradle 8.11.1 + KSP
| 组件 | 说明 |
|---|---|
CallScreeningService |
来电筛选服务,拦截陌生来电 |
SmsService |
前台服务,发送自动回复短信 |
ContactsHelper |
通讯录查询工具 |
AppDatabase |
Room 数据库,存储拦截记录和白名单 |
HomeScreen |
Compose UI 主界面 |
- Android Studio Ladybug (2024.2.1) 或更高版本
- JDK 17
- Android SDK 35
git clone https://github.com/yourusername/FuckJunkCall.git
cd FuckJunkCall# 清理构建
./gradlew clean
# 构建 Debug 版本
./gradlew assembleDebug
# 安装到设备
./gradlew installDebug# 单元测试
./gradlew test
# 集成测试(需要连接设备)
./gradlew connectedAndroidTest# Lint 检查
./gradlew lint
# 查看报告
open app/build/reports/lint-results-debug.htmlapp/src/main/java/com/hoseadev/fuckjunkcall/
├── MainActivity.kt # 应用入口
├── service/
│ ├── CallScreeningService.kt # 来电筛选核心服务
│ └── SmsService.kt # 短信发送服务
├── data/
│ ├── model/
│ │ ├── BlockedCall.kt # 拦截记录实体
│ │ └── WhitelistNumber.kt # 白名单实体
│ └── database/
│ ├── AppDatabase.kt # Room 数据库
│ ├── BlockedCallDao.kt # 拦截记录 DAO
│ └── WhitelistDao.kt # 白名单 DAO
├── ui/
│ ├── screens/
│ │ └── HomeScreen.kt # 主界面
│ └── theme/ # Material 3 主题
└── util/
├── ContactsHelper.kt # 通讯录工具
└── PreferenceHelper.kt # 配置管理
A: 请检查:
- 是否授予了"来电筛选"角色权限
- 是否开启了"启用拦截功能"开关
- 号码是否在通讯录或白名单中
- 查看 logcat 日志:
adb logcat -s CallScreeningService:D
A: 可能的原因:
- 未授予"发送短信"权限
- 未开启"自动短信回复"开关
- 余额不足或运营商限制
- 小米手机:MIUI 会弹出确认框,首次发送时勾选"记住选择"
A: 这是 MIUI 的安全策略,解决方法:
- 安全中心 → 应用管理 → FuckJunkCall → 权限 → 短信 → 始终允许
- 第一次发送时勾选"记住我的选择"或"不再询问"
- 之后应该就能自动发送了
A: 取决于运营商:
- 大部分运营商:"您拨打的电话正在通话中"
- 部分运营商:直接转到语音信箱
A: 不会,只要满足以下任一条件就不会被拦截:
- 号码在系统通讯录中
- 号码在应用白名单中
- ✅ 所有数据本地存储,不上传到服务器
- ✅ 不收集用户隐私信息
- ✅ 通讯录查询仅用于判断是否陌生号码
- ✅ 拦截记录仅保存在本地数据库
本项目采用 MIT 协议开源。
MIT License
Copyright (c) 2025 FuckJunkCall
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:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
欢迎提交 Issue 和 Pull Request!
- Bug 报告:请描述复现步骤、设备型号、Android 版本
- 功能建议:请说明使用场景和预期效果
- Fork 本仓库
- 创建特性分支 (
git checkout -b feature/AmazingFeature) - 提交更改 (
git commit -m 'Add some AmazingFeature') - 推送到分支 (
git push origin feature/AmazingFeature) - 开启 Pull Request
本应用仅供学习和个人使用,使用前请确保:
- 遵守当地法律法规
- 不用于商业用途
- 自行承担使用风险
开发者不对因使用本应用导致的任何损失负责。
如果觉得有用,请给个 ⭐ Star!