当前位置: 首页 > 知识库问答 >
问题:

在后台模式android 11下,蓝牙不会扫描附近的设备

司徒钱青
2023-03-14

我尝试在后台模式下扫描附近的蓝牙设备,它在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"/>

//用于扫描api版本在21以上的Ble设备

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
                }

共有2个答案

逄烨
2023-03-14

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

背景=

在我的例子中,这是在dislay关闭时进行应用程序扫描所必需的。

毛德华
2023-03-14

您还需要添加ACCESS\u rough\u LOCATION和ACCESS\u FINE\u LOCATION权限。有关更多信息,请查看以下链接:-

  • 需要为Android 6.0上的BLE扫描启用位置
  • 需要为Android 10.0上的BLE扫描启用位置
  • 在未经用户许可的情况下打开Android LE扫描
  • 蓝牙扫描仪未发现设备
  • Android BLE开发终极指南
 类似资料:
  • 我试图用BLE API扫描附近的蓝牙设备,但它似乎不起作用 我已经在清单中添加了权限 以下内容在创建对象时 创建扫描仪回调对象并进一步扫描 在logcat中,我只看到以下内容 这是我的app build gradle } 有人能指出我在这里遗漏了什么吗?

  • 开启蓝牙扫描 参数说明 字段 类型 必须? 说明 blePrefix String 是 设备名称类型前缀 示例代码 Swift: RokidMobileSDK.binder.startBLEScan(blePrefix: String) ->Bool Objc: [RokidMobileSDK.binder startBLEScanWithBlePrefix:@"Rokid-"]; 手机蓝牙未打

  • 扫描设备 介绍 需要传入扫描蓝牙设备的名称的前缀,回调均在主线程。如果传空,是无法获取设备列表。 1、单前缀蓝牙设备 参数说明 字段 类型 必须? 说明 type String 是 设备名称类型前缀 举个大栗子 String type = "Rokid-" RokidMobileSDK.binder.startBTScan(type, new IBTScanCallBack() { @Ov

  • 我正在尝试使用基于处理的android应用程序扫描蓝牙设备。我想使用处理通过蓝牙与我的微控制器板通信,如下例所示: http://webdelcire.com/wordpress/archives/1045 我成功地在我的android平板电脑上启动了这个应用程序。但是,我无法在平板电脑上列出蓝牙设备。我的平板电脑识别的唯一蓝牙设备是我电脑上的蓝牙适配器。为什么我不能列出所有蓝牙设备?我的电脑能够

  • 我制作了一个android应用程序来扫描蓝牙设备,并向我的服务器发送一个HTTP请求,这样我就可以检测它们是开着还是关着。我已经用我的带有蓝牙适配器的台式电脑测试过了,效果很好。当检测到电脑上的蓝牙功能时,它显示电脑是打开的,当我关闭电脑上的蓝牙功能时,它是关闭的。现在,我需要使用这个应用程序的设备有:雅伯投影仪、Bose SoundLink和JBL耳机,但我遇到了一些问题。 首先,投影仪似乎无法

  • 问题内容: 我正在寻找一种以编程方式列出我的设备所找到的附近任何蓝牙设备(可发现)的方法。我无法找到有关在Swift3.0中执行此调用的任何信息或教程。这篇QA帖子讨论了使用Swift 1.0查找这些设备并在Xcode 6(而不是最新版本8)中进行构建。 我尽力将代码从1.0转换为3.0语法,但是在运行以下代码时,Playground不返回任何内容: 问题答案: 正确使用IOBluetooth 下