WiFi检测功能说明.md 10 KB

WiFi 检测功能说明

🎯 功能概述

应用启动时自动检测 WiFi 连接状态,如果未连接 WiFi,会弹出提示对话框,引导用户去设置 WiFi。

✅ 已实现的功能

1. 自动检测 WiFi 连接

  • PandoraEntryActivity 启动时自动检测
  • 延迟 2 秒执行,避免影响启动速度
  • 兼容 Android 6.0+ 和更低版本

2. 强制连接提示对话框

弹出对话框包含两个选项:

  • 去设置 - 跳转到系统 WiFi 设置页面
  • 不再提示 - 保存用户选择,以后不再提示

重要特性

  • ✅ 对话框不可取消(点击外部无效)
  • ✅ 从 WiFi 设置返回后自动重新检测
  • ✅ 如果仍未连接,继续提示,直到连接成功
  • ✅ 必须连接 WiFi 或选择"不再提示"才能继续

3. 用户偏好记忆

  • 如果用户选择"不再提示",会保存到 SharedPreferences
  • 可以通过代码重置设置,允许再次提示

📂 新增文件

1. WifiCheckHelper.java

路径app/src/main/java/com/YuyeTech/HeartRate/WifiCheckHelper.java

主要方法

// 检查 WiFi 是否连接
public static boolean isWifiConnected(Context context)

// 显示 WiFi 未连接对话框
public static void showWifiNotConnectedDialog(Activity activity)

// 检查是否应该跳过 WiFi 检测
public static boolean shouldSkipWifiCheck(Context context)

// 重置 WiFi 检测设置
public static void resetWifiCheckSettings(Context context)

// 在 Activity 启动时自动检测 WiFi
public static void checkWifiOnActivityStart(Activity activity)

2. MyApplication.java(已修改)

onActivityCreated() 中添加了 WiFi 检测:

// ✅ 检测 WiFi 连接(仅对 PandoraEntryActivity)
if (activity instanceof io.dcloud.PandoraEntryActivity) {
    Log.d(TAG, "🔍 开始检测 WiFi 连接...");
    WifiCheckHelper.checkWifiOnActivityStart(activity);
}

🔍 工作流程

应用启动
    ↓
PandoraEntryActivity 创建
    ↓
延迟 2 秒
    ↓
检查用户偏好(是否选择了"不再提示")
    ↓
如果未跳过 → 检测 WiFi 连接状态
    ↓
如果未连接 WiFi → 显示提示对话框(不可取消)
    ↓
用户选择:
  - 去设置 → 跳转到系统 WiFi 设置
      ↓
    从设置返回(Activity onResume 自动触发)
      ↓
    延迟 500ms 后立即检测(确保 UI 稳定)
      ↓
    如果仍未连接 → 立即显示对话框(强制,无法逃避)🔁
    如果已连接 → 检测通过 ✅
      
  - 不再提示 → 保存偏好,关闭对话框

关键特性:
  ✅ 每次 onResume 都检测(不管从哪里返回)
  ✅ 延迟仅 500ms,几乎立即弹出
  ✅ 无法通过快速返回逃避检测
  ✅ 必须连接 WiFi 或选择"不再提示"

🎨 对话框界面

┌─────────────────────────────────┐
│      WiFi 未连接                 │
├─────────────────────────────────┤
│                                 │
│  检测到设备未连接 WiFi 网络。    │
│                                 │
│  请配置 WiFi 后才能继续使用。    │
│                                 │
├─────────────────────────────────┤
│     [不再提示]      [去设置]    │
└─────────────────────────────────┘

注意:
- 对话框不可取消(点击外部无效)
- 从设置返回后会自动重新检测
- 如果仍未连接,继续提示

🧪 测试方法

方法 1:使用测试脚本(推荐)

双击运行:测试WiFi检测功能.bat

脚本会自动:

  1. 检查应用安装状态
  2. 停止应用
  3. 提示断开 WiFi
  4. 启动应用
  5. 查看相关日志

方法 2:手动测试

  1. 在设备上断开 WiFi 连接
  2. 启动应用
  3. 观察是否弹出提示对话框
  4. 测试三个按钮的功能

方法 3:ADB 命令测试

# 1. 断开 WiFi(需要 root)
adb shell svc wifi disable

# 2. 启动应用
adb shell am start -n com.YuyeTech.HeartRate/io.dcloud.PandoraEntry

# 3. 查看日志
adb logcat | findstr "WifiCheckHelper"

# 4. 重新连接 WiFi
adb shell svc wifi enable

📊 期望的日志输出

WiFi 未连接时

D WifiCheckHelper: 是否跳过 WiFi 检测: false
D WifiCheckHelper: WiFi 连接状态: false
D WifiCheckHelper: ⚠️ WiFi 未连接,显示提示对话框(必须连接)
D WifiCheckHelper: ✅ WiFi 未连接对话框已显示(必须连接)
D WifiCheckHelper: 用户选择:去设置

从设置返回后仍未连接(持续检测)

D MyApplication: 📱 PandoraEntryActivity onResume → 开始 WiFi 检测
D WifiCheckHelper: ⚠️ onResume 时 WiFi 未连接
D WifiCheckHelper: 📌 已标记需要重新检测 WiFi(onResume 时触发)
... 500ms 后 ...
D WifiCheckHelper: ⚠️ WiFi 仍未连接,显示提示对话框(强制)
D WifiCheckHelper: ✅ WiFi 未连接对话框已显示(必须连接)

从设置返回后已连接

D WifiCheckHelper: ✅ onResume 时 WiFi 已连接

WiFi 已连接时

D WifiCheckHelper: 是否跳过 WiFi 检测: false
D WifiCheckHelper: WiFi 连接状态: true
D WifiCheckHelper: ✅ WiFi 已连接或 Activity 已结束

用户选择"不再提示"后

D WifiCheckHelper: 是否跳过 WiFi 检测: true
D WifiCheckHelper: 用户已选择不再提示,跳过 WiFi 检测

🔧 自定义配置

修改延迟时间

WifiCheckHelper.java 中修改:

activity.getWindow().getDecorView().postDelayed(() -> {
    // ...
}, 2000); // ← 修改这里的延迟时间(毫秒)

修改对话框文本

WifiCheckHelper.javashowWifiNotConnectedDialog() 方法中修改:

.setTitle("WiFi 未连接")  // ← 标题
.setMessage("检测到设备未连接 WiFi 网络。\n\n是否现在配置 WiFi?")  // ← 消息

修改按钮文本

.setPositiveButton("去设置", ...)     // ← 主按钮
.setNegativeButton("不再提示", ...)   // ← 取消按钮

修改对话框可取消性

.setCancelable(false)  // ← false = 不可取消,true = 可取消

修改重新检测延迟时间

// 在 checkWifiOnActivityResume() 中
activity.getWindow().getDecorView().postDelayed(() -> {
    // ...
}, 500);  // ← 修改这里的延迟时间(毫秒)
// 推荐 500ms,太短可能导致 UI 不稳定,太长用户可能逃避检测

禁用持续检测(不推荐)

MyApplication.java 中注释掉:

// WifiCheckHelper.checkWifiOnActivityResume(activity);

重置用户偏好

如果需要让用户重新看到提示,可以调用:

WifiCheckHelper.resetWifiCheckSettings(context);

或通过 ADB 清除:

adb shell pm clear com.YuyeTech.HeartRate

🎯 使用场景

场景 1:首次启动

  • 用户首次安装应用
  • 如果未连接 WiFi,会提示配置
  • 用户可以选择立即配置或稍后

场景 2:开机自启动

  • 设备重启后应用自动启动
  • 如果 WiFi 未自动连接,会提示用户
  • 方便用户快速配置网络

场景 3:网络断开后重启应用

  • WiFi 断开后重新启动应用
  • 自动检测并提示用户重新连接

场景 4:用户选择不再提示

  • 某些场景下不需要 WiFi(如离线使用)
  • 用户可以选择"不再提示"
  • 应用不会再弹出 WiFi 检测对话框

⚠️ 注意事项

1. 权限要求

应用需要以下权限(已在 AndroidManifest.xml 中声明):

  • ACCESS_NETWORK_STATE - 检测网络状态
  • ACCESS_WIFI_STATE - 检测 WiFi 状态

2. 检测时机

  • 只在 PandoraEntryActivity 启动时检测
  • 不在 PandoraEntry 启动时检测(避免重复)
  • 延迟 2 秒执行,避免影响启动速度

3. 用户体验

  • 对话框可以取消(点击外部或按返回键)
  • 提供"不再提示"选项,尊重用户选择
  • 跳转到系统设置,而不是自定义 WiFi 配置界面

4. Kiosk 模式兼容

  • WiFi 检测不影响 Kiosk 模式
  • 对话框可以在 LockTask 模式下显示
  • 用户可以从 WiFi 设置返回应用

🔄 与现有功能的集成

1. 与 Kiosk 模式集成

  • WiFi 检测在 Kiosk 初始化之后执行
  • 不影响锁屏禁用、屏幕常亮等功能
  • 对话框可以在全屏模式下正常显示

2. 与开机自启动集成

  • 开机后应用自动启动
  • 如果 WiFi 未自动连接,会提示用户
  • 用户可以快速配置网络

3. 与 WifiModule 集成

  • 使用 WifiModule.openWifiSettings() 跳转设置
  • 可以扩展为使用 WifiModule.showWifiDialogView() 显示自定义 WiFi 列表

💡 扩展建议

1. 使用自定义 WiFi 配置界面

如果想使用应用内的 WiFi 配置界面,可以修改:

.setPositiveButton("去设置", (dialog, which) -> {
    // 使用自定义 WiFi 配置界面
    WifiModule.showWifiDialogView(activity, new WifiCallback() {
        @Override
        public void onConnecting() {
            Log.d(TAG, "正在连接 WiFi...");
        }
        
        @Override
        public void onConnected() {
            Log.d(TAG, "WiFi 连接成功");
        }
        
        @Override
        public void onFailed(String reason) {
            Log.e(TAG, "WiFi 连接失败: " + reason);
        }
        
        @Override
        public void onDisconnected() {
            Log.d(TAG, "WiFi 已断开");
        }
    });
})

2. 定期检测 WiFi 状态

可以添加定时检测功能:

// 在 MyApplication 中添加
private Handler wifiCheckHandler = new Handler();
private Runnable wifiCheckRunnable = new Runnable() {
    @Override
    public void run() {
        // 检测 WiFi 状态
        wifiCheckHandler.postDelayed(this, 60000); // 每分钟检测一次
    }
};

3. 网络状态监听

可以监听网络状态变化:

ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback() {
    @Override
    public void onLost(Network network) {
        // WiFi 断开时提示
    }
};

📝 更新日志

2026-01-23

  • ✅ 创建 WifiCheckHelper.java
  • ✅ 集成到 MyApplication.java
  • ✅ 添加用户偏好记忆功能
  • ✅ 创建测试脚本和文档

创建时间:2026-01-23
功能版本:1.0
兼容版本:Android 6.0+