BLE улучшить проверку прав для ScanCallback () в Kotlin - PullRequest
1 голос
/ 18 марта 2020

Я работаю над небольшим приложением с устройством BLE. Иногда обратный вызов сканирования работает нормально, и я могу найти устройство, но в других случаях обратный вызов сканирования не работает, и мне было интересно, если что-то не так с моим кодом или есть проблема с моей проверкой прав доступа.

Вот мой код:

override fun onCreate(savedInstanceState: Bundle?) {

    if (!isBLESupported(this)) {
        Toast.makeText(this, "This device doesn't support bluetooth", Toast.LENGTH_SHORT).show()
        finish()
    } else {
        if (!mBtAdapter!!.isEnabled) {
            val enableBluetoothIntent = Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE)
            startActivityForResult(enableBluetoothIntent, REQUEST_ENABLE_BLUETOOTH)
        }
    }

    adapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, macList)
    list_view.adapter = adapter

private val lightUUID = UUID.fromString("0000ffb0-0000-1000-8000-00805f9b34fb")
scan_button.setOnClickListener {
        scanForDeviceWithFilter(lightUUID)
    }
}

private fun scanForDeviceWithFilter(serviceUUID: UUID) {

    val uuid = ParcelUuid(id)
    val filter = ScanFilter.Builder().setServiceUuid(uuid).build()
    val filters = listOf(filter)
    val settings = ScanSettings.Builder().setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY).build()

   checkBTPermissions()
    mBtAdapter!!.bluetoothLeScanner.startScan(filters, settings, scanDevicesCallback)
}

  private val scanDevicesCallback = object : ScanCallback() {

    override fun onScanResult(callbackType: Int, result: ScanResult?) {
        result?.let {
            if (!macList.contains(result.device.name.toString())) {
                macList.add(result.device.name.toString())
                adapter.notifyDataSetChanged()
            }
            Log.d(TAG, "device found:${result.device}")
        }

    }

    override fun onScanFailed(errorCode: Int) {
        Log.d(TAG, "Scan failed $errorCode")
    }
}

private fun isBLESupported(context: Context): Boolean {
    return BluetoothAdapter.getDefaultAdapter() != null && context.packageManager.hasSystemFeature(
        PackageManager.FEATURE_BLUETOOTH_LE
    )
}

private fun checkBTPermissions() {
    val permissionCheck = checkSelfPermission("Manifest.permission.ACCESS_FINE_LOCATION")
    if (permissionCheck != 0) {
        requestPermissions(
            arrayOf(Manifest.permission.ACCESS_FINE_LOCATION), 1001
        )
    }
}

init {
    mBtAdapter = BluetoothAdapter.getDefaultAdapter()
}
...