0
@RequiresApi(Build.VERSION_CODES.LOLLIPOP)
    private fun discover(){
        val mBluetoothLeScanner: BluetoothLeScanner =BluetoothAdapter.getDefaultAdapter().bluetoothLeScanner
        val mHandler: Handler = Handler()
        val scanCallback = object:ScanCallback() {
            override fun onScanResult(callbackType: Int, result: ScanResult?) {
                Log.d(TAG, "onscanresult...")
                super.onScanResult(callbackType, result)

                if (result == null || result.getDevice() == null || TextUtils.isEmpty(result.getDevice().getName())
                ) return

                val builder = StringBuilder(result.getDevice().getName())
                builder.append("\n").append(
                    result.getScanRecord()
                        ?.getServiceData(result.getScanRecord()!!.getServiceUuids().get(0)),
                    Charset.forName("UTF-8")
                )
                //Observed result
                Log.d(TAG, builder.toString())
            }

            override fun onBatchScanResults(results:List<ScanResult>?){
                Log.d(TAG, "Scanning...")
                super.onBatchScanResults(results)
            }

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

        val filters: ArrayList<ScanFilter> = ArrayList<ScanFilter>()
        val uuid = UUID.randomUUID()
        val filter: ScanFilter = ScanFilter.Builder().setServiceUuid(ParcelUuid(UUID.fromString(uuid.toString()))).build()
        filters.add(filter)
        val settings: ScanSettings = ScanSettings.Builder().setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY).build()
        mBluetoothLeScanner?.startScan(filters, settings, scanCallback)
        Log.d(TAG, "StartScan...")
        mHandler.postDelayed(object : Runnable {
            override fun run() {
                mBluetoothLeScanner?.stopScan(scanCallback)
            }
        }, 10000)
        finish()
    }

On the code above, I have implemented BLE Scanning to receive a string. However, it seems like scanCallback has problem, but I am not sure what is it. On the Logcat, it shows "Startscan...", but it doesn't show "onscanresult...", so I assume the problem is on scanCallback. What could be the reason?? This code was written based on https://code.tutsplus.com/tutorials/how-to-advertise-android-as-a-bluetooth-le-peripheral--cms-25426, but as the example is in Java, I have implemented on Kotlin by myself. I have tried checking on the filters as well, but the problems seems to be on scanCallback.

Hally
  • 81
  • 8
  • Your app needs the correct permissions to use BLE. Did you request them? – Michael Kotzjan Jun 28 '21 at 04:35
  • Yes, thye are – Hally Jun 28 '21 at 06:29
  • 1
    A problem that often occures is that the location permission might be granted in the manifest but is not given at runtime. You have to request the location permission at runtime manually: https://developer.android.com/training/location/permissions. Check out this answer as well: https://stackoverflow.com/a/40142454/7473793 – Michael Kotzjan Jun 28 '21 at 06:34

0 Answers0