You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

求助:Android 8.1.0屏幕关闭时BLE扫描停止的解决方案

解决Android 8.1.0息屏后BLE扫描停止的问题

你碰到的这个情况确实是Android 8.1.0官方引入的限制——为了优化电池续航,系统会在设备息屏后暂停后台BLE扫描,亮屏后自动恢复。不过有几种可行的方案能尝试绕过这个限制,实现屏幕无论开关都持续扫描:

1. 使用前台服务(Foreground Service)

这是最稳定可靠的方案,因为前台服务拥有更高的系统优先级,不会被后台资源限制策略影响。具体实现步骤:

  • 创建一个继承自Service的BLE扫描服务类
  • 在服务启动时调用startForeground()方法,传入一个可见的通知(Android O及以上版本强制要求前台服务必须绑定通知)
  • 在服务内部执行你的BLE扫描逻辑,这样即使设备息屏,扫描进程也能持续运行

示例代码片段:

class BLEScanForegroundService : Service() {
    private val NOTIFICATION_ID = 1001
    private val CHANNEL_ID = "BLE_SCAN_CHANNEL"

    override fun onCreate() {
        super.onCreate()
        // Android O+ 必须创建通知渠道
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            val channel = NotificationChannel(
                CHANNEL_ID,
                "BLE持续扫描服务",
                NotificationManager.IMPORTANCE_LOW
            )
            val notificationManager = getSystemService(NotificationManager::class.java)
            notificationManager.createNotificationChannel(channel)
        }
        // 构建前台通知
        val notification = NotificationCompat.Builder(this, CHANNEL_ID)
            .setContentTitle("BLE扫描中")
            .setContentText("正在持续探测周边BLE设备")
            .setSmallIcon(R.drawable.ic_bluetooth)
            .build()
        // 启动前台服务
        startForeground(NOTIFICATION_ID, notification)
        // 启动BLE扫描
        startContinuousBLEScan()
    }

    private fun startContinuousBLEScan() {
        // 这里编写你的BLE扫描核心逻辑
    }

    override fun onBind(intent: Intent?): IBinder? = null
}

2. 将应用加入电池优化白名单

系统的电池优化策略会限制后台应用的活动,把应用加入白名单后,系统会放宽对它的资源限制:

  • 手动操作路径:设置 → 电池 → 电池优化 → 找到你的应用 → 选择「不优化」
  • 也可以通过代码请求用户授权,直接跳转至设置页面:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    val packageName = packageName
    val powerManager = getSystemService(POWER_SERVICE) as PowerManager
    if (!powerManager.isIgnoringBatteryOptimizations(packageName)) {
        val intent = Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS).apply {
            data = Uri.parse("package:$packageName")
        }
        startActivity(intent)
    }
}

⚠️ 注意:谷歌Play商店对使用REQUEST_IGNORE_BATTERY_OPTIMIZATIONS权限的应用审核非常严格,只有健康监测、实时导航这类刚需型应用才容易通过审核。

3. 调整BLE扫描模式

尝试使用SCAN_MODE_LOW_LATENCY扫描模式,它的优先级比其他模式更高,虽然不能100%保证息屏后持续扫描,但相比默认模式,被系统暂停的概率更低:

ScanSettings scanSettings = new ScanSettings.Builder()
    .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
    .build();
bluetoothLeScanner.startScan(null, scanSettings, scanCallback);

额外提醒

  • 以上方案都会不同程度增加设备耗电量,需要在功能需求和电池续航之间做好平衡
  • 前台服务会一直显示通知,你可以设计成允许用户手动关闭通知,但关闭后扫描可能会被系统暂停

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

火山引擎 最新活动