Android 10无法使用BLE蓝牙扫描

时间:2019-10-17 09:00:34

标签: android bluetooth-lowenergy

我正在研究BLE蓝牙扫描在除Android 10之外的所有设备上都可以使用。Android 10无法正常工作,任何人请回答有关版本10的问题以扫描BLE蓝牙

8 个答案:

答案 0 :(得分:7)

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

 Sub color()

  Dim color As Integer

  For Each cell In Sheets(1).Range("AA2:AA7000")

    If cell.Value = 6 Then
    ColorIndex = 6

        ElseIf cell.Value <> 6 Then ColorIndex = -4142

    End If

    cell.EntireRow.Interior.ColorIndex = color

nextcell:

  Next cell

End Sub

val lm = getSystemService(Context.LOCATION_SERVICE) as LocationManager if (!LocationManagerCompat.isLocationEnabled(lm)) { // Start Location Settings Activity, you should explain to the user why he need to enable location before. startActivity(Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS)) } 类在LocationManagerCompat依赖项中可用,如果您不使用androidx,则可以改用:

androidx.appcompat:appcompat:1.1.0

答案 1 :(得分:1)

对于我来说,如果我在 AndroidManifest 中使用fine permission,它就可以正常工作。手动打开手机“设置”中的位置,然后将应用权限设置为位置。

答案 2 :(得分:1)

尝试

//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
        }
    };

答案 3 :(得分:1)

仅向AndroidManifest.xml添加以下权限

android.permission.ACCESS_FINE_LOCATION,  
android.permission.ACCESS_COARSE_LOCATION,  
android.permission.ACCESS_BACKGROUND_LOCATION. 

向MainActivity添加权限,例如

ActivityCompat.requestPermissions(
  this, 
  new String[ 
    {
      Manifest.permission.ACCESS_FINE_LOCATION, 
      Manifest.permission.ACCESS_COARSE_LOCATION, 
      Manifest.permission.ACCESS_BACKGROUND_LOCATION, 
      Manifest.permission.READ_EXTERNAL_STORAGE
  }, 0);

答案 4 :(得分:1)

我遇到了同样的问题,而我刚刚使用cordova-plugin-android-permissions对其进行了修复。

Android 10(SDK 29)需要ACCESS_FINE_LOCATION,而以前的版本仅需要ACCESS_COARSE_LOCATION。 (有关此Android Developers page的更多信息)

与其他答案状态不同,ACCESS_BACKGROUD_LOCATION 不是必需的。除非确实需要,否则最好不要使用它。 Play商店认为背景位置是危险的权限,并会要求您填写一些表格以说明为什么需要它。

旧插件只要求ACCESS_COARSE_LOCATION许可,这对于Android 9(SDK 28)和旧版本就足够了。最好的解决方案是更新插件。但是,如果很难做到,则有一个简单的解决方法。

cordova-plugin-android-permissionsnpm link)添加到您的项目中,并使用它来请求ACCESS_FINE_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”中添加任何内容即可获得此权限。

答案 5 :(得分:0)

要使BLE扫描在定位到Android 10的Android应用上工作,您需要询问用户

  

ACCESS_BACKGROUND_LOCATION

以及ACCESS_FINE_LOCATION,也不要忘记在清单中添加权限:

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

以下是原因:

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

您的问题简而言之:

  

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

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

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

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

要在您的应用程序中声明服务的前台服务类型,请将应用程序的targetSdkVersion或compileSdkVersion设置为29或更高。详细了解前台服务如何继续执行需要访问位置的用户启动操作。

希望这可以解决您的问题:)

答案 6 :(得分:0)

我想在android 10中仅具有位置许可是不够的。扫描设备时,应打开您的位置服务。因此,请询问用户是否打开了定位服务。

替代解决方案: 您可以在Android 8及更高版本上使用Companion device pairing。请注意,在我看来,它没有充分记录,可能有点不稳定。例如,当我分配一个扫描过滤器(BLE Service UUID)时,配对设备配对崩溃,但是没有该过滤器,它就起作用了。

答案 7 :(得分:0)

尝试将 callbackType 设置为 CALLBACK_TYPE_ALL_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)