来电模拟器 是一款 Android 模拟来电应用,旨在提供高度仿真的来电体验。支持自定义来电号码、归属地、SIM 卡序号,内置 5 种主流手机品牌铃声,配合炫彩流光特效、滑动接听挂断手势、持续震动反馈与壁纸实时高斯模糊,营造逼真的来电场景。
包名:com.jay.inmcomingcall
最低兼容:Android 8.0 (API 26)
目标版本:Android 15 (API 35)
构建工具:Gradle 8.11.1 + Kotlin DSL
| 环境 | 版本 |
|---|---|
| JDK | 11+ |
| Gradle | 8.11.1 |
| compileSdk | 35 (Android 15) |
| minSdk | 26 (Android 8.0) |
| targetSdk | 35 |
| versionCode | 10 |
| versionName | 2.0 |
构建使用 app/build.gradle.kts,Release 版本自动命名:来电模拟器_V2.0_2026.07.19.apk。
依赖库:
项目采用简洁的 3 + 2 架构:3 个 Activity + 2 个工具类。
inmcomingcall/
└── app/src/main/java/com/jay/inmcomingcall/
├── IncomingCallActivity.java # 来电主界面 (552行)
├── ConnectedActivity.java # 通话中界面 (150行)
├── SettingsActivity.java # 设置界面 (225行)
├── VibratorUtil.java # 震动反馈工具类 (98行)
└── WallpaperBlurUtil.java # 壁纸高斯模糊工具 (160行)Text
资源文件方面,包含 38 个可绘制资源、5 个机型铃声 MP3、3 个动画资源、日间/夜间双主题。
入口 Activity,包含以下核心功能:
| 功能 | 实现方式 |
|---|---|
| 来电信息显示 | 从 SharedPreferences 读取号码、归属地、卡号 |
| 机型铃声 | MediaPlayer 循环播放 raw 目录对应机型 MP3 |
| 持续震动 | VibratorUtil 800ms 震 + 800ms 停循环 |
| 按钮跳动动画 | AnimatorSet 两段跳动 + OvershootInterpolator 弹性复位 |
| 绿色涟漪特效 | View 缩放 + 透明度渐出,700ms 完成扩散淡出 |
| 左右流光光效 | 8 种状态循环,HSV 色相 6 秒一圈连续过渡 |
| 滑动接听/挂断 | Touch 监听,以基准值计算位移,超过 320px 触发操作 |
| 沉浸模式 | 适配 Android 11+ WindowInsetsController |
button.setOnTouchListener((v, event) -> {
switch (event.getAction()) {
case ACTION_DOWN:
cancelBounceAnimation(); // 立即停止跳动
downY = event.getRawY();
startTranslationY = v.getTranslationY();
return true;
case ACTION_MOVE:
float delta = downY - event.getRawY();
float newY = startTranslationY - delta;
newY = Math.max(-maxOffset, Math.min(0, newY));
v.setTranslationY(newY); // 跟手滑动
return true;
case ACTION_UP:
if (fingerDelta > THRESHOLD_Y) { // 超过阈值
if (isAnswer) {
VibratorUtil.vibrateAnswer(this);
startActivity(new Intent(this, ConnectedActivity.class));
} else {
finishAffinity(); // 退出
}
} else {
v.animate().translationY(0).start(); // 弹回
restartBounceCycle();
}
return true;
}
});Java
模拟通话接通界面:Handler 驱动每秒计时器(MM:SS),功能按钮包含录音、静音、挂断等 9 个操作。
ScrollView 内排列 4 张配置卡片:号码信息、位置信息、机型铃声选择(自定义 Dialog 替代 Spinner 解决滚动冲突)、震动开关。数据通过 SharedPreferences 持久化。
兼容 Android 12+ 的 VibratorManager 新 API,提供三种震动模式:
{0, 800, 800} 循环{0, 100, 100, 100} 两次短震createOneShot(100ms) 单次短震无需 RenderScript:壁纸 1/8 降采样 → 3 次快速均值模糊(Box Blur)→ 放大回目标尺寸,子线程执行不阻塞 UI。
直接安装 Release APK 或通过 Android Studio 部署。首次打开自动进入来电界面,点击底部"设置"按钮配置号码、归属地、机型铃声。
初次实现使用简单 translationY 累加,跟手性差。最终方案:ACTION_DOWN 记录当前 translationY 为基准,MOVE 时基准值减去手指位移计算新位置,彻底解决跳变。
ValueAnimator 在 0°→360° HSV 色相空间线性插值,外层亮度 50%、内层 100%,配合 PorterDuff.SRC_IN 颜色滤镜,4 行代码完成着色。
1/8 降采样 → 3 次快速均值模糊 → 放大回目标尺寸,兼容所有 API 级别,无需第三方依赖。
为什么用 Java 而非 Kotlin?Java 生态成熟、兼容性处理更直观。为啥不用第三方框架?原生 View 系统完全足够,引入框架增加 APK 体积。所有动画使用系统属性动画(ObjectAnimator / ValueAnimator),性能与可控性兼得。