Android-приложение возвращает 0 устройств после сканирования на наличие - PullRequest
0 голосов
/ 15 июня 2019

В последние месяцы я разрабатывал приложение, в котором его функция реализует соединение BLE от приложения к устройству.Внезапно сегодня, после нескольких сканирований, приложение возвращает каждый раз 0 устройств, несмотря на то, что раньше получалось примерно 5 или 6.

Я подумал, что это была проблема с правами доступа, связанная с грубым расположением, однако изменения, которые я сделал, сделали этобыло настолько мало, что это не должно быть затронуто, но это не имеет значения

Поскольку я следовал руководству bluetooth , которое Google предлагает среди других руководств, это мой код:

Метод onCreate:

 override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_guide)
        handler = Handler()
        devicesResult = ArrayList()

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

            // Android M Permission check

            if (this.checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED)
                {
                val builder = AlertDialog.Builder(this)
                builder.setTitle("This app needs location access")
                builder.setMessage("Please grant location access so this app can detect beacons.")
                builder.setPositiveButton(android.R.string.ok, null)
                builder.setOnDismissListener { requestPermissions(arrayOf(Manifest.permission.ACCESS_COARSE_LOCATION), PERMISSION_REQUEST_COARSE_LOCATION) }
                builder.show()
            }else{

                if (areLocationServicesEnabled(this))
                {

                    if (!packageManager.hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE))
                    {
                        Toast.makeText(this, R.string.ble_not_supported, Toast.LENGTH_SHORT).show()
                        finish()
                    }

                    bluetoothAdapter?.takeIf { it.isDisabled }?.apply {
                        val enableBtIntent = Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE)
                        startActivityForResult(enableBtIntent, 1)
                    }

                    //scanLeDevice(true)
                }
            }
        }
}

Метод onRequestPermissionsResult:

override fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array<String>, grantResults: IntArray
    ) {
        when (requestCode) {
            PERMISSION_REQUEST_COARSE_LOCATION -> {
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    //Log.d(FragmentActivity.TAG, "coarse location permission granted")
                } else {
                    val builder = AlertDialog.Builder(this)
                    builder.setTitle("Functionality limited")
                    builder.setMessage("Since location access has not been granted, this app will not be able to discover beacons when in the background.")
                    builder.setPositiveButton(android.R.string.ok, null)
                    builder.setOnDismissListener { }
                    builder.show()
                }
                return
            }
        }
    }

areLocationServicesEnabled метод:

private fun areLocationServicesEnabled(context:Context):Boolean {
        val locationManager = context.getSystemService(Context.LOCATION_SERVICE) as LocationManager
        return try {
            locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) || locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)
        } catch (e:Exception) {
            e.printStackTrace()
            false
        }
    }

Метод onResume:

override fun onResume() {
        super.onResume()
        if (bluetoothAdapter != null && !bluetoothAdapter!!.isEnabled)
        {
            val enableBtIntent = Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE)
            startActivityForResult(enableBtIntent, 1)
        }

            mLEScanner = bluetoothAdapter!!.bluetoothLeScanner
            scanLeDevice(true)

    }

scanLeDevicemethod:

private fun scanLeDevice(enable:Boolean) {
        if (enable)
        {
            handler!!.postDelayed({
                mLEScanner!!.stopScan(mScanCallback)

                //selectDevice()
            }, SCAN_PERIOD)
            mLEScanner!!.startScan(mScanCallback)
        }
        else
        {
            mLEScanner!!.stopScan(mScanCallback)
        }
    }

Атрибут mScanCallback:

private val mScanCallback = object : ScanCallback() {
        override fun onScanResult(callbackType: Int, result: ScanResult) {
            Log.i("callbackType", callbackType.toString())
            Log.i("result", result.toString())
            devicesResult!!.add(result)


        }

        override fun onBatchScanResults(results: List<ScanResult>) {
            for (sr in results) {
                Log.i("ScanResult - Results", sr.toString())
            }
        }

        override fun onScanFailed(errorCode: Int) {
            Log.e("Scan Failed", "Error Code: $errorCode")
        }
    }

Как я уже говорил, я ожидал показать и сохранить на массиве с именем deviceResult каждое из них, однако внезапно никаких устройств не было.Кажется, появляется после каждого нового сканирования.

...