【问题标题】:Bluetooth does not scan near by devices in background mode android 11+蓝牙不会在后台模式下扫描附近的设备 android 11+
【发布时间】:2021-12-19 05:20:12
【问题描述】:

我尝试在后台模式下扫描附近的蓝牙设备,它在某些设备上不起作用,例如 android 11+。

这是我的示例代码,在前台工作得很好

// 授予所有权限

 <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
 <!--BLUETOOTH PERMISSION-->
    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <!-- Needed only if your app looks for Bluetooth devices.
             If your app doesn't use Bluetooth scan results to derive physical
             location information, you can strongly assert that your app
             doesn't derive physical location. -->
    <uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
    <!-- Needed only if your app makes the device discoverable to Bluetooth
      devices. -->
    <uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
    <!-- Needed only if your app communicates with already-paired Bluetooth
           devices. -->
    <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
    <!--bibo01 : hardware option-->
    <uses-feature android:name="android.hardware.bluetooth" android:required="false"/>
    <uses-feature android:name="android.hardware.bluetooth_le" android:required="false"/>

//用于21以上api版本的扫描蓝牙设备

private var settings: ScanSettings?         = null
private val scanFilters = java.util.ArrayList<ScanFilter>()
private var mLEScanner: BluetoothLeScanner? = null
private var adapter: BluetoothAdapter?        = null




    val adapterBlu = applicationContextNew.getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager
    adapter = adapterBlu.adapter

    mLEScanner = adapter!!.bluetoothLeScanner
    settings   = ScanSettings.Builder()
        //.setScanMode(ScanSettings.SCAN_MODE_LOW_POWER)
        .build()
    //scan specified devices only with ScanFilter
    val scanFilter = ScanFilter.Builder()
        //.setDeviceName("BIBO 1")
        .build()
    scanFilters.add(scanFilter)



  mLEScanner = adapter!!.bluetoothLeScanner
    settings   = ScanSettings.Builder()
        .build()
    //scan specified devices only with ScanFilter
    val scanFilter = ScanFilter.Builder()
        .build()
    scanFilters.add(scanFilter)

// 扫描:

 mLEScanner!!.startScan(scanFilters, settings, highScanCallback)


//high Scan callback
private val highScanCallbackClackmass =
    object : ScanCallback() {
        override fun onScanResult(callbackType: Int, result: ScanResult) {

            
            if (result.device.name != null && result.device.address != null){
                if ("BIBO 1" == result.device.name.toString()) {
                    //globalDeviceAddress = result.device.address.toString()
                }
            }

        }
    }

还尝试了屏幕唤醒解决方案:(在 android 10 以下工作)

val pm: PowerManager = getSystemService(POWER_SERVICE) as PowerManager
                val isScreenOn: Boolean = pm.isInteractive // check if screen is on
                if (!isScreenOn) {
                    val wl: PowerManager.WakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK or PowerManager.ACQUIRE_CAUSES_WAKEUP, "myApp:notificationLock")
                    wl.acquire(9000) //set your time in milliseconds
                }

【问题讨论】:

  • 我在小米手机上启用了“在锁定屏幕上显示”权限,现在它可以在 android 11 上运行:i.stack.imgur.com/f6nUn.png

标签: android bluetooth-lowenergy android-bluetooth


【解决方案1】:

电池限制也会影响后台的 BLE 工作(在我的设备上注意到,但当时是 Android 10)。

设置 => 应用程序 => 管理应用程序 => 您的应用程序 => 省电模式 => 设置为“无限制”。

就我而言,这是在显示屏关闭时进行应用扫描所必需的。

【讨论】:

  • 我在 2 部手机上进行了测试,在 android 10 中工作,但在 android 11 中不工作
  • 我在小米手机上启用了“在锁定屏幕上显示”权限,现在它可以在 android 11 上运行:i.stack.imgur.com/f6nUn.png
【解决方案2】:

【讨论】:

  • 在屏幕锁定和后台模式下仍然无法工作(已授予所有权限)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多