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

三星S6锁屏时BLE扫描停止设备发现的技术问题求助

解决三星S6锁屏后BLE扫描停止的问题

根据你描述的情况,这个问题大概率是三星S6(Android 5.x Lollipop)的定制化电池优化策略导致的——哪怕你已经开启了忽略电池优化,三星在该机型上对后台BLE扫描的限制依然很严格,和S7+及Pixel的原生/优化后的系统逻辑不一样。下面是针对性的解决方案:

核心解决方案

1. 将扫描逻辑移至前台服务

Android 5.x开始,后台进程的优先级会被系统大幅降低,而三星S6在此基础上又加了额外的后台限制。把BLE扫描放在前台服务中,通过startForeground()方法启动(需要显示一个持续的通知),系统会将其视为高优先级任务,锁屏后不会轻易暂停扫描。

示例代码思路:

public class BLEScanService extends Service {
    private BluetoothLeScanner scanner;
    private ScanCallback scanCallback;

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // 创建前台通知
        Notification notification = new NotificationCompat.Builder(this, "BLE_SCAN_CHANNEL")
                .setContentTitle("BLE扫描中")
                .setSmallIcon(R.drawable.ic_scan)
                .build();
        startForeground(1, notification);

        // 初始化并启动BLE扫描
        scanner = BluetoothAdapter.getDefaultAdapter().getBluetoothLeScanner();
        scanCallback = new ScanCallback() {
            @Override
            public void onScanResult(int callbackType, ScanResult result) {
                // 处理扫描结果
            }
        };
        scanner.startScan(getScanFilters(), getScanSettings(), scanCallback);

        return START_STICKY;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        if (scanner != null) {
            scanner.stopScan(scanCallback);
        }
        stopForeground(true);
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    private List<ScanFilter> getScanFilters() {
        // 你的UUID过滤逻辑
        ScanFilter filter = new ScanFilter.Builder()
                .setServiceUuid(ParcelUuid.fromString("你的UUID"))
                .build();
        return Collections.singletonList(filter);
    }

    private ScanSettings getScanSettings() {
        // 可以尝试调整扫描模式,比如SCAN_MODE_LOW_LATENCY(注意功耗)
        return new ScanSettings.Builder()
                .setScanMode(ScanSettings.SCAN_MODE_LOW_POWER)
                .build();
    }
}

2. 检查三星专属电池优化设置

三星S6自带的智能管理器(或电池优化模块)有额外的后台限制,即使你开启了系统级的“忽略电池优化”,也需要:

  • 打开智能管理器 → 电池 → 未监视的应用 → 添加你的应用
  • 关闭该应用的“深度睡眠”选项(如果有)
  • 确保“后台限制”未对该应用生效

3. 调整扫描过滤方式

你当前使用的是系统级UUID扫描过滤,三星S6的Lollipop系统可能在锁屏后会暂停过滤扫描的逻辑。可以尝试去掉系统过滤,在扫描回调中手动过滤UUID:

@Override
public void onScanResult(int callbackType, ScanResult result) {
    BluetoothDevice device = result.getDevice();
    List<ParcelUuid> uuids = result.getScanRecord().getServiceUuids();
    if (uuids != null && uuids.contains(ParcelUuid.fromString("你的目标UUID"))) {
        // 处理符合条件的设备
    }
}

4. 谨慎使用唤醒锁(可选)

如果前台服务依然无效,可以尝试使用PARTIAL_WAKE_LOCK保持CPU唤醒,但注意这会增加功耗,建议仅在必要时使用:

PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
PowerManager.WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "BLE_SCAN_WAKE_LOCK");
wakeLock.acquire();
// 扫描结束后记得释放:wakeLock.release();

为什么其他机型正常?

  • 三星S7及以后的机型,调整了后台BLE扫描的优化策略,对前台服务和忽略电池优化的应用更友好;
  • Pixel机型运行原生Android,没有三星的定制化限制,系统对后台扫描的逻辑更符合标准Android规范。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:08:34