【问题标题】:List BLE devices Android - Kotlin列出 BLE 设备 Android - Kotlin
【发布时间】:2018-06-18 13:09:35
【问题描述】:

我正在尝试使用 Kotlin 列出 Android 设备上的所有 BLE 设备(Java 版本也不起作用),但我没有收到任何设备或任何回调,除了“扫描已经开始” 我在清单中有正确的使用权限。

这是我正在尝试的当前最少代码。 但即使是来自 Google 的示例代码也列出了任何设备。 我在 Pixel 上运行 Android 版本 8.1.0。 我让它在 iOS 上运行,带有基本的 BLE 设备列表 (Swift)!

 private val bleScanner = object :ScanCallback() {
    override fun onScanResult(callbackType: Int, result: ScanResult?) {
        super.onScanResult(callbackType, result)
        Log.d("DeviceListActivity","onScanResult: ${result?.device?.address} - ${result?.device?.name}")
    }

    override fun onBatchScanResults(results: MutableList<ScanResult>?) {
        super.onBatchScanResults(results)
        Log.d("DeviceListActivity","onBatchScanResults:${results.toString()}")
    }

    override fun onScanFailed(errorCode: Int) {
        super.onScanFailed(errorCode)
        Log.d("DeviceListActivity", "onScanFailed: $errorCode")
    }

}

private val bluetoothLeScanner: BluetoothLeScanner
    get() {
        val bluetoothManager = applicationContext.getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager
        val bluetoothAdapter = bluetoothManager.adapter
        return bluetoothAdapter.bluetoothLeScanner
    }

class ListDevicesAdapter(context: Context?, resource: Int) : ArrayAdapter<String>(context, resource)

override fun onCreate(savedInstanceState: Bundle?) {
    Log.d("DeviceListActivity", "onCreate()")
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_device_list)


}

override fun onStart() {
    Log.d("DeviceListActivity","onStart()")
    super.onStart()

    bluetoothLeScanner.startScan(bleScanner)

}

override fun onStop() {
    bluetoothLeScanner.stopScan(bleScanner)
    super.onStop()
}

【问题讨论】:

  • 我发现了问题!我没有清单中的 和应用程序中用户的接受。 requestPermissions(arrayOf(Manifest.permission.ACCESS_COARSE_LOCATION), PERMISSION_REQUEST_COARSE_LOCATION) 有了这个,它就像一个魅力!

标签: android kotlin bluetooth bluetooth-lowenergy


【解决方案1】:

您需要声明权限:

uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

对于 android 6.0 + 的设备,您手动请求此权限:

  override fun onStart() {
        Log.d("ScanDeviceActivity", "onStart()")
        super.onStart()
        when (PermissionChecker.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)) {
            PackageManager.PERMISSION_GRANTED -> bluetoothLeScanner.startScan(bleScanner)
            else -> requestPermissions(arrayOf(Manifest.permission.ACCESS_COARSE_LOCATION), 1)
        }
    }


   override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
        when (requestCode) {
            1 -> when (grantResults) {
                intArrayOf(PackageManager.PERMISSION_GRANTED) -> {
                    Log.d("ScanDevices", "onRequestPermissionsResult(PERMISSION_GRANTED)")
                    bluetoothLeScanner.startScan(bleScanner)
                }
                else -> {
                    Log.d("ScanDevices", "onRequestPermissionsResult(not PERMISSION_GRANTED)")
                }
            }
            else -> super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-07
    相关资源
    最近更新 更多