提问者:小点点

需要android.permission.BLUETOOTH_SCAN归因来源权限的问题


我正在使用打印机d11,并尝试使用蓝牙将其连接到我的设备。但我遇到了这个错误:需要android。permission.BLUETOOTH_SCAN对AttributionSource的权限。

我已经添加了权限,但我仍然有错误,它指出我的问题就在这里。

@SuppressLint("MissingPermission")
private fun searchForPrinters() {
        val bluetoothManager =
            requireActivity().getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager
        bluetoothAdapter = bluetoothManager.adapter
        if (bluetoothAdapter == null) {
            AlertsUtil.showBaseOkWarningDialog(
                requireActivity(),
                getString(R.string.bluetooth_not_available),
                ""
            )
            return
        } else if (!bluetoothAdapter!!.isEnabled) {
            askToEnableBluetooth()
            return
        }

        // The line that causes the problem
        if (bluetoothAdapter?.isDiscovering == true) {
            Logger.log(TAG, "cancel start discovery")
            bluetoothAdapter?.cancelDiscovery()
        }

        initBluetoothScanBroadcastReceiver()
        bluetoothAdapter?.startDiscovery()
    }

共2个答案

匿名用户

在< code>Manifest.xml文件上添加以下权限

<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />

检查用户是否授予权限

private fun isPermissionsGranted(context: Context): Boolean {
    return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
        ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED &&
                ContextCompat.checkSelfPermission(context, Manifest.permission.BLUETOOTH_CONNECT) == PackageManager.PERMISSION_GRANTED &&
                ContextCompat.checkSelfPermission(context, Manifest.permission.BLUETOOTH_SCAN) == PackageManager.PERMISSION_GRANTED
    } else {
        ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED
    }
}

请求用户允许继续蓝牙扫描。

if (!isPermissionsGranted(activity)) {

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

        val permissions = mutableSetOf(
            Manifest.permission.BLUETOOTH,
            Manifest.permission.BLUETOOTH_ADMIN,
            Manifest.permission.ACCESS_COARSE_LOCATION,
            Manifest.permission.ACCESS_FINE_LOCATION,
        )

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
            permissions.add(Manifest.permission.BLUETOOTH_CONNECT)
            permissions.add(Manifest.permission.BLUETOOTH_SCAN)
        }

        ActivityCompat.requestPermissions(
            activity, permissions.toTypedArray(), 600
        )
    }
}

匿名用户

为了在您的Android设备上正确使用蓝牙,需要将以下权限添加到您的清单文件中:-

<uses-permission android:name="android.permission.BLUETOOTH_CONNECT"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />

然后应该在运行时请求这些权限,如下面的链接所示:-

  • 蓝牙扫描仪未发现设备
  • 无需请求用户许可即可打开LE扫描
  • 如何在运行时请求位置权限
  • Android BLE终极指南