Как обновить текстовое представление в Bluetooh LeScanCallback? - PullRequest
0 голосов
/ 24 октября 2018

Я использую BluetoothAdapter.LeScanCallback для сканирования устройств BLE.Как только я получу необходимые отсканированные данные, я бы хотел отобразить их в текстовом представлении.Однако текстовое представление не обновляется отсканированными данными.Благодарим Вас за помощь.

        private TextView TV_uuid;
        private TextView TV_major;
        private TextView TV_minor;    

    //Find BLE devices
    private Runnable scanRunnable = new Runnable() {
        @Override
        public void run() {
            if (isScanning) {
                if (btAdapter != null) {
                    btAdapter.stopLeScan(leScanCallback);
                }
            } else {
                if (btAdapter != null) {
                    btAdapter.startLeScan(leScanCallback);
                }
            }
            isScanning = !isScanning;
            scanHandler.postDelayed(this, scan_interval_ms);
        }
    };


        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            TV_uuid = (TextView)findViewById(R.id.tv_uuid2);
            TV_major = (TextView)findViewById(R.id.tv_major2);
            TV_minor = (TextView)findViewById(R.id.tv_minor2);  
            //start scan BLE
            scanHandler.post(scanRunnable);     

        }

        private BluetoothAdapter.LeScanCallback leScanCallback = new BluetoothAdapter.LeScanCallback() {
            @Override
            public void onLeScan(final BluetoothDevice bluetoothDevice, final int rssi, final byte[] scanData) {
                if (scanData[7] == 0x02 && scanData[8] == 0x15) { // iBeacon indicator
                    UUID uuid = getGuidFromByteArray(Arrays.copyOfRange(scanData, 9, 25));
                    int major = (scanData[25] & 0xff) * 0x100 + (scanData[26] & 0xff);
                    int minor = (scanData[27] & 0xff) * 0x100 + (scanData[28] & 0xff);
                    byte txpw = scanData[29];
                    Log.i(TAG, "iBeacon Major = " + major + " | Minor = " + minor + " TxPw " + (int)txpw + " | UUID = " + uuid.toString()); 
                    TV_uuid.setText(uuid.toString());
                    TV_major.setText(major);
                    TV_minor.setText(minor);
                }
            }
        };

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Если я правильно помню, этот обратный вызов выполняется в отдельном потоке, поэтому не следует помещать обновления просмотра непосредственно в обратный вызов.Если вы просто хотите протестировать, вы можете обернуть обновления представлений внутри вызова runOnUiThread () и посмотреть, работает ли это.

runOnUiThread(new Runnable(){
       public void run(){
         //set the value of your textviews here 
       } 
   }
}

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

0 голосов
/ 24 октября 2018

Вероятно, if (scanData[7] == 0x02 && scanData[8] == 0x15) препятствует выполнению кода.Или вы забыли запустить сканирование и установить прослушиватель onLeScanCallback

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...