首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在后台模式android 11+中,蓝牙无法扫描附近的设备。

在后台模式android 11+中,蓝牙无法扫描附近的设备。
EN

Stack Overflow用户
提问于 2021-11-05 03:31:52
回答 2查看 373关注 0票数 2

我尝试在后台模式下扫描附近的蓝牙设备,但它在一些设备上不起作用,比如安卓11+。

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

//已授予所有权限

代码语言:javascript
复制
 <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版本的Ble设备

代码语言:javascript
复制
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)

//扫描:

代码语言:javascript
复制
 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以下版本)

代码语言:javascript
复制
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
                }
EN

回答 2

Stack Overflow用户

发布于 2021-11-05 07:21:03

Stack Overflow用户

发布于 2021-11-05 11:49:53

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

Settings => Apps => Manage Apps => Your App =>电池节约设置=>设置为"No restrictions“。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69848393

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档