Android 10不支持蓝牙扫描

Android 10不支持蓝牙扫描,android,bluetooth-lowenergy,Android,Bluetooth Lowenergy,我正在开发BLE蓝牙扫描,除了Android 10,其他所有设备都在开发。安卓10不工作,任何人请回答关于扫描BLE蓝牙的版本10问题的问题要使BLE扫描在针对安卓10的安卓应用上工作,您需要向用户询问 访问\u背景\u位置 除了ACCESS\u FINE\u位置之外,也不要忘记在清单中添加权限: <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" /> 原因如下: Andr

我正在开发BLE蓝牙扫描,除了Android 10,其他所有设备都在开发。安卓10不工作,任何人请回答关于扫描BLE蓝牙的版本10问题的问题

要使BLE扫描在针对安卓10的安卓应用上工作,您需要向用户询问

访问\u背景\u位置

除了ACCESS\u FINE\u位置之外,也不要忘记在清单中添加权限:

<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />

原因如下:

Android 10(API级别29)引入了许多功能和行为更改,以更好地保护用户的隐私。这些变化扩大了用户对其数据和应用程序功能的透明度和控制

简而言之,你的问题是:

在后台访问设备位置需要权限

为了支持用户对应用程序访问位置信息的额外控制,Android 10引入了权限

与和权限不同,ACCESS_BACKGROUND_LOCATION权限仅影响应用程序在后台运行时对位置的访问。除非满足以下条件之一,否则应用程序将被视为在后台访问位置:

属于应用程序的活动可见。 应用程序正在运行已声明位置的前景服务类型的前景服务

要为应用中的服务声明前台服务类型,请将应用的targetSdkVersion或CompileSDK版本设置为29或更高。进一步了解前台服务如何继续用户发起的需要访问位置的操作


希望这能解决您的问题:)

您需要启用位置才能在android 10上执行BLE扫描。 要检查位置是否已启用并要求用户启用位置服务(Kotlin),请执行以下操作:

LocationManagerCompat
类在
androidx中提供。appcompat:appcompat:1.1.0
依赖项,如果不使用androidx,可以使用:

lm.isLocationEnabled()

对我来说,如果我在AndroidManifest中使用
精细权限
,它就会起作用。手动打开手机设置中的位置,并将应用程序权限设置为位置。

尝试此操作

//gradle
dependencies {
implementation 'no.nordicsemi.android.support.v18:scanner:1.4.3'
}
//import
import no.nordicsemi.android.support.v18.scanner.BluetoothLeScannerCompat;
import no.nordicsemi.android.support.v18.scanner.ScanCallback;
import no.nordicsemi.android.support.v18.scanner.ScanResult;
import no.nordicsemi.android.support.v18.scanner.ScanSettings;
//init scan setting
final ScanSettings settings = new ScanSettings.Builder().setReportDelay(1000).setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY).build();
//start scan
scanner.startScan(null, settings, scanCallback);
//scan callback
private final ScanCallback scanCallback = new ScanCallback() {
        @Override
        public void onScanResult(final int callbackType, @NonNull final ScanResult result) {
            super.onScanResult(callbackType, result);
        }
        public void onBatchScanResults(@NonNull final List<ScanResult> results) {
            for (final ScanResult result : results) {
                //result.getDevice() is scanned device
            }
        }
        @Override
        public void onScanFailed(final int errorCode) {
            // should never be called
        }
    };
//gradle
依赖关系{
实现“no.nordicsemi.android.support.v18:scanner:1.4.3”
}
//进口
导入编号:nordicsemi.android.support.v18.scanner.BluetoothLeScannerCompat;
导入编号:nordicsemi.android.support.v18.scanner.ScanCallback;
导入编号:nordicsemi.android.support.v18.scanner.ScanResult;
导入编号:nordicsemi.android.support.v18.scanner.ScanSettings;
//初始扫描设置
final ScanSettings settings=new ScanSettings.Builder().setReportDelay(1000).setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY).build();
//开始扫描
scanner.startScan(空、设置、扫描回调);
//扫描回调
private final ScanCallback ScanCallback=新建ScanCallback(){
@凌驾
public void onScanResult(final int callbackType,@NonNull final ScanResult){
super.onScanResult(回调类型、结果);
}
public void onBatchScanResults(@NonNull final List results){
用于(最终扫描结果:结果){
//result.getDevice()是已扫描的设备
}
}
@凌驾
公共无效OnScan失败(最终int错误代码){
//永远不应该被称为
}
};

向AndroidManifest.xml添加以下权限是不够的

android.permission.ACCESS\u FINE\u位置,
android.permission.ACCESS\u位置,
android.permission.ACCESS\u BACKGROUND\u位置。
向MainActivity添加权限,例如

ActivityCompat.requestPermissions(
这
新字符串[]
{
Manifest.permission.ACCESS\u FINE\u位置,
Manifest.permission.ACCESS\u位置,
Manifest.permission.ACCESS\u BACKGROUND\u位置,
Manifest.permission.READ\u外部存储
}, 0);

我也遇到了同样的问题,我刚刚用
cordova插件android权限解决了这个问题

Android 10(SDK 29)需要
访问精细位置
,而以前的版本只需要
访问粗略位置
。(更多信息在此)

与其他一些回答状态不同,
ACCESS\u background\u LOCATION
不是必需的。除非你真的需要,否则最好不要要求它。游戏商店认为背景位置是一个危险的许可,并会要求你填写一些表格来证明你为什么需要它

旧的插件只要求
访问\u位置
权限,这对于Android 9(SDK 28)和旧版本已经足够了。最好的解决方案是更新插件。但如果这很难做到,有一个简单的解决办法

cordova插件android权限
()添加到项目中,并使用它请求
ACCESS\u FINE\u LOCATION
权限

将此代码添加到“设备就绪”功能中,以检查您的应用程序是否已具有此权限:

permissions = cordova.plugins.permissions;
permissions.checkPermission(permissions.ACCESS_FINE_LOCATION, checkPermissionSuccessCallback, checkPermissionErrorCallback);
然后创建以下回调函数以请求用户权限:

function checkPermissionSuccessCallback(status) {
    if (status.hasPermission) {
        console.log("Permission OK");
    } else {
        console.log("Permission not OK");
        // ask user permission
        permissions.requestPermission(permissions.ACCESS_FINE_LOCATION, requestPermissionSuccessCallback, requestPermissionErrorCallback);
    }
}

您不需要在“config.xml”中添加任何内容就可以获得此权限。

我想在android 10中,仅拥有位置权限是不够的。扫描设备时,应打开定位服务。因此,如果位置服务已关闭,请要求用户打开它

替代解决方案:
您可以使用android 8或更高版本。请注意,在我看来,它没有很好的文档记录,而且可能有点不稳定。例如,当我分配了一个扫描筛选器(BLE服务UUID)时,配套设备配对崩溃,但没有该筛选器,它工作了。

尝试将callbackType设置为CALLBACK\u TYPE\u ALL\u MATCHES,它为我解决了问题

val scanSettings = ScanSettings.Builder()
scanSettings.setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
scanSettings.setCallbackType(ScanSettings.CALLBACK_TYPE_ALL_MATCHES)
scanSettings.setMatchMode(ScanSettings.MATCH_MODE_AGGRESSIVE)

val filter = ScanFilter.Builder()
filter.setServiceUuid(ParcelUuid(Service_UUID))
bluetooth.bluetoothLeScanner.startScan(mutableListOf<ScanFilter>(filter.build()), scanSettings.build(), callback)
val scanSettings=scanSettings.Builder()
scanSettings.setScanMode(scanSettings.SCAN_MODE_LOW_LATEN
val scanSettings = ScanSettings.Builder()
scanSettings.setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
scanSettings.setCallbackType(ScanSettings.CALLBACK_TYPE_ALL_MATCHES)
scanSettings.setMatchMode(ScanSettings.MATCH_MODE_AGGRESSIVE)

val filter = ScanFilter.Builder()
filter.setServiceUuid(ParcelUuid(Service_UUID))
bluetooth.bluetoothLeScanner.startScan(mutableListOf<ScanFilter>(filter.build()), scanSettings.build(), callback)