You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用startLocalOnlyHotspot编程创建热点时热点立即消失问题

Android本地热点创建后立即消失问题排查与解决

问题核心

使用WifiManager.startLocalOnlyHotspot创建热点后立即消失,Logcat提示系统资源调用关闭失败,已尝试前台服务、WorkManager仍未解决。

关键原因与解决方案

1. 未持有Reservation强引用(核心问题)

onStarted回调返回的WifiManager.LocalOnlyHotspotReservation是热点的唯一持有凭证,若仅在回调中临时使用、未保存全局强引用,会被GC自动回收,导致热点直接停止。

修复代码示例:

// 在类级别声明全局变量,确保强引用持有
private var hotspotReservation: WifiManager.LocalOnlyHotspotReservation? = null

private val wifiManager: WifiManager by lazy {
    applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager
}

// 启动热点时保存Reservation
fun startHotspot() {
    wifiManager.startLocalOnlyHotspot(object : WifiManager.LocalOnlyHotspotCallback() {
        override fun onStarted(reservation: WifiManager.LocalOnlyHotspotReservation) {
            super.onStarted(reservation)
            hotspotReservation = reservation // 强引用持有凭证
            val config = reservation.wifiConfiguration
            // 可在此处获取热点SSID、密码等信息
        }

        override fun onStopped() {
            super.onStopped()
            hotspotReservation = null // 热点停止后释放引用
        }

        override fun onFailed(reason: Int) {
            super.onFailed(reason)
            // 处理启动失败逻辑,比如提示用户
        }
    }, Handler(Looper.getMainLooper()))
}

2. 前台服务实现不规范

若使用前台服务托管热点,需确保服务符合系统要求,避免被系统回收:

  • 在Manifest中声明必要权限:
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    
  • 服务中必须启动前台通知(Android 8.0+强制要求):
    class HotspotService : Service() {
        private var hotspotReservation: WifiManager.LocalOnlyHotspotReservation? = null
        private val wifiManager by lazy {
            getSystemService(Context.WIFI_SERVICE) as WifiManager
        }
    
        override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
            // 创建前台通知
            val notification = NotificationCompat.Builder(this, "HOTSPOT_CHANNEL")
                .setContentTitle("本地热点运行中")
                .setContentText("点击查看热点信息")
                .setSmallIcon(R.drawable.ic_hotspot)
                .build()
    
            // 启动前台服务
            startForeground(1, notification)
            // 启动热点
            startHotspotInternal()
            return START_STICKY
        }
    
        private fun startHotspotInternal() {
            wifiManager.startLocalOnlyHotspot(object : WifiManager.LocalOnlyHotspotCallback() {
                override fun onStarted(reservation: WifiManager.LocalOnlyHotspotReservation) {
                    super.onStarted(reservation)
                    hotspotReservation = reservation
                }
    
                override fun onStopped() {
                    super.onStopped()
                    hotspotReservation = null
                    stopForeground(STOP_FOREGROUND_REMOVE)
                    stopSelf()
                }
            }, Handler(Looper.getMainLooper()))
        }
    
        override fun onBind(intent: Intent?): IBinder? = null
    }
    

3. 排除厂商系统限制

部分定制ROM(如小米、华为)存在后台权限、省电策略限制:

  • 关闭应用的省电模式,将应用设置为不优化电池使用
  • 手动开启应用的后台运行权限(路径:设置-应用管理-你的应用-权限-后台运行)

日志提示说明

系统资源调用关闭失败通常是Reservation被提前回收导致的连锁错误,解决强引用问题后该日志会自动消失。

内容的提问来源于stack exchange,提问作者Mhmd Razi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 00:47:40