Почему isMultipleAdvertisementSupported () возвращает false, когда getBluetoothLeAdvertiser возвращает объект?


Я пытаюсь играть с передачей BLE на моем устройстве.

Вот код, который я использую, и вывод:

// check BLE support
Log.i(TAG, "BLE supported: " + getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)); // true

// check BLE transmission support
final BluetoothManager bluetoothManager =
        (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
BluetoothAdapter mBluetoothAdapter = bluetoothManager.getAdapter();

Log.i(TAG, "isMultipleAdvertisementSupported: " + mBluetoothAdapter.isMultipleAdvertisementSupported()); // false
Log.i(TAG, "isOffloadedFilteringSupported: " + mBluetoothAdapter.isOffloadedFilteringSupported()); // false
Log.i(TAG, "isOffloadedScanBatchingSupported: " + mBluetoothAdapter.isOffloadedScanBatchingSupported()); // false

BluetoothLeAdvertiser mBluetoothLeAdvertiser = mBluetoothAdapter.getBluetoothLeAdvertiser();
Log.i(TAG, mBluetoothLeAdvertiser.toString()); //android.bluetooth.le.BluetoothLeAdvertiser@1c51f789

// check BLE transmission support
// android-beacon-library, https://github.com/AltBeacon/android-beacon-library
int result = BeaconTransmitter.checkTransmissionSupported(getApplicationContext());
Log.i(TAG, "ABL checkTransmissionSupported: " + result); // 0
Я не могу понять, почему mBluetoothLeAdvertiser не null, так как mBluetoothLeAdvertiser проверяет, что это не false:
package android.bluetooth;
// ...

public BluetoothLeAdvertiser getBluetoothLeAdvertiser() {
    if (getState() != STATE_ON) {
        return null;
    }
    if (!isMultipleAdvertisementSupported()) {
        return null;
    }
    synchronized(mLock) {
        if (sBluetoothLeAdvertiser == null) {
            sBluetoothLeAdvertiser = new BluetoothLeAdvertiser(mManagerService);
        }
    }
    return sBluetoothLeAdvertiser;
}

// ...

public boolean isMultipleAdvertisementSupported() {
    if (getState() != STATE_ON) return false;
    try {
        return mService.isMultiAdvertisementSupported();
    } catch (RemoteException e) {
        Log.e(TAG, "failed to get isMultipleAdvertisementSupported, error: ", e);
    }
    return false;
}
1 4

1 ответ:

Добро пожаловать в мир Android, который является одновременно открытым и закрытым исходным кодом! Ваш анализ кода с открытым исходным кодом BluetoothLeAdvertiser выше является правильным. Если этот код выполняется на вашем мобильном устройстве,вы не увидите вывод, который показывает тест в верхнем фрагменте кода. Вывод: код, показанный во втором фрагменте, не должен быть тем, что находится на устройстве.

Производители Android-устройств могут свободно раскручивать исходный код и изменять его, чтобы он работал с их оборудованием. В этом случае я знаю, что Motorola сделала то же самое в этом коде для своих устройств Moto X и Moto G. Эти устройства возвращают a BluetoothLeAdvertiser, несмотря на то, что isMultipleAdvertisementSupported() возвращает false. Инженер Motorola объяснил мне, что они изменили это, потому что они хотели поддерживать рекламу, несмотря на использование чипа BLE, который мог поддерживать только одну рекламу одновременно. Действительно, я проверил, что устройства Motorola могут рекламировать, но если вы пытаетесь получить две рекламы одновременно, это не удается.