Проблема обнаружения Android BLE - PullRequest
0 голосов
/ 10 декабря 2018

Я разрабатываю и приложение для Android с Bluetooth, но иногда у меня возникают проблемы с обнаружением устройств LE: обычно обратный вызов обнаружения возвращает мне найденные устройства, но иногда перестает работать и не возвращает устройства.

Я тестировал код (в режиме отладки) на разных устройствах (Samsung, LG) и на разных версиях Android (8.0, 6.0, 4.4), но проблема одна и та же, не является систематической и через некоторое время возвращается к нормальной работе..

Я применил все предложения, найденные в интернете:

, но проблемаpersist.

Ниже приведены фрагменты манифеста:

.
.
.
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>

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

<uses-feature android:name="android.hardware.location.gps" />
<uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>
.
.
.

и код Bluetooth:

public BLEH_RES StartDiscovery()
{
    .
    .
    .
    CheckPermission();

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
        return(scanLeDevice21(true));
    else
        return(scanLeDevice18(true));
}

 /**
 * Scan BLE devices on Android API 20 to last version (Android 9.0)
 *
 * @param enable Enable scan
 */
@RequiresApi(21)
private BLEH_RES scanLeDevice21(boolean enable)
{
    bluetoothLeScanner = bluetoothAdapter.getBluetoothLeScanner();

    if (bluetoothLeScanner == null)
        return(BLEH_RES.BLE_NOT_SUPPORTED);

    if (enable)
    {
        ScanSettings.Builder scanSettings = new ScanSettings.Builder();
        scanSettings.setScanMode(SCAN_MODE_LOW_LATENCY);
        bluetoothLeScanner.startScan(null, scanSettings.build(), BLEScanCallback);
    }
    else
        bluetoothLeScanner.stopScan(BLEScanCallback);

    return(BLEH_RES.OK);
}

/**
 * Scan BLE devices on Android API 18 to 20
 *
 * @param enable Enable scan
 */
private BLEH_RES scanLeDevice18(boolean enable)
{
    if(bluetoothAdapter == null)
        return(BLEH_RES.BT_NOT_SUPPORTED);


    if (enable) 
    {
        bluetoothAdapter.startDiscovery();
        bluetoothAdapter.startLeScan(mLeScanCallback);
    }
    else
    {
        bluetoothAdapter.cancelDiscovery();
        bluetoothAdapter.stopLeScan(mLeScanCallback);
    }

    return(BLEH_RES.OK);
}

@RequiresApi(21)
private ScanCallback BLEScanCallback = new ScanCallback()
{
    @Override
    public void onScanResult(int callbackType, ScanResult result)
    {
        addDevice(result.getDevice(), result.getRssi(), result.getScanRecord().getBytes());
    }

    @Override
    public void onScanFailed(int errorCode)
    {
        for(ErrorEvent ee:errorEventList)
            ee.onError(BLEH_EVENT_ERROR.SCAN_FAILED);
    }
};

private BluetoothAdapter.LeScanCallback mLeScanCallback = new BluetoothAdapter.LeScanCallback()
{
    @Override
    public void onLeScan(final BluetoothDevice bluetoothDevice, int rssi,byte[] scanRecord)
    {
        addDevice(bluetoothDevice, rssi, scanRecord);
    }
};

Можете ли вы предложить мне что-нибудь для решения этой проблемы?

Ответы [ 2 ]

0 голосов
/ 26 января 2019

Я решил свою проблему, следуя предложениям по этой ссылке: https://stackoverflow.com/a/42267678/7006955

Я добавляю в свой код весь предложенный код, и он прекрасно работает и в Android 4

0 голосов
/ 12 декабря 2018

Убедитесь, что GPS включен все время поиска устройств.Также предлагаю вам посмотреть это про BLE https://youtu.be/jDykHjn-4Ng

...