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

部分设备(一加、摩托罗拉等)Beacon扫描延迟问题求助

针对一加/小米/摩托罗拉设备AltBeacon扫描间隔过长的解决方案

这些设备的定制ROM(ColorOS、MIUI、MyUI等)存在严格的后台限制,即使使用前台服务,系统仍可能主动降低Beacon扫描频率,以下是针对性的解决措施:

  • 强制获取“始终允许”的位置权限
    这类ROM会限制后台位置访问权限,仅授予“仅使用时允许”会导致后台扫描被大幅节流。必须引导用户手动开启位置权限-始终允许,代码中可通过以下逻辑跳转设置页:

    if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED ||
        ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_BACKGROUND_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        ActivityResultContracts.RequestMultiplePermissions contract = new ActivityResultContracts.RequestMultiplePermissions();
        registerForActivityResult(contract, result -> {
            Boolean fineGranted = result.get(Manifest.permission.ACCESS_FINE_LOCATION);
            Boolean backgroundGranted = result.get(Manifest.permission.ACCESS_BACKGROUND_LOCATION);
            if (fineGranted == null || !fineGranted || backgroundGranted == null || !backgroundGranted) {
                // 引导用户前往应用设置页手动开启权限
                Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                intent.setData(Uri.parse("package:" + getPackageName()));
                startActivity(intent);
            }
        }).launch(new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_BACKGROUND_LOCATION});
    }
    
  • 调整AltBeacon扫描参数,禁用系统调度扫描
    部分ROM会篡改Android O+默认的JobScheduler扫描调度,导致间隔拉长。强制使用传统扫描模式并设置激进的扫描周期:

    BeaconManager beaconManager = BeaconManager.getInstanceForApplication(this);
    // 禁用JobScheduler,避免系统调度干扰
    beaconManager.setEnableScheduledScanJobs(false);
    // 强制应用始终使用前台扫描参数(扫描1.1秒,无间隔持续扫描)
    beaconManager.setForegroundScanPeriod(1100);
    beaconManager.setForegroundBetweenScanPeriod(0);
    beaconManager.setBackgroundMode(false);
    // 确保Beacon解析器正确配置(根据你的Beacon类型调整)
    beaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24"));
    
  • 将应用加入系统电池优化白名单
    一加、小米的智能省电策略会冻结后台服务(即使是前台服务),必须引导用户将应用排除在电池优化之外:

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE);
        String packageName = getPackageName();
        if (!pm.isIgnoringBatteryOptimizations(packageName)) {
            Intent intent = new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
            intent.setData(Uri.parse("package:" + packageName));
            startActivity(intent);
        }
    }
    
  • 开启特定ROM的后台权限
    不同ROM需额外开启专属权限:

    • 小米:开启自启动权限、后台弹出界面权限,并在“省电策略”中设置为“无限制”
    • 一加:在“电池优化”中关闭应用的智能省电,开启“允许后台活动”
    • 摩托罗拉:开启“后台活动权限”,关闭“自适应电池”对该应用的限制
  • 确保前台服务通知可见且高优先级
    部分ROM会将低优先级的前台服务通知视为无效,进而降级为后台服务。需设置通知渠道为高重要性:

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        NotificationChannel channel = new NotificationChannel("BEACON_SCAN", "Beacon扫描服务", NotificationManager.IMPORTANCE_HIGH);
        NotificationManager notificationManager = getSystemService(NotificationManager.class);
        notificationManager.createNotificationChannel(channel);
    }
    // 创建前台服务通知时指定该渠道
    Notification notification = new NotificationCompat.Builder(this, "BEACON_SCAN")
            .setContentTitle("Beacon扫描中")
            .setContentText("正在搜索周边Beacon设备")
            .setSmallIcon(R.drawable.ic_scan)
            .setPriority(NotificationCompat.PRIORITY_HIGH)
            .build();
    startForeground(1, notification);
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 15:32:51