La pubblicità diretta funziona - almeno con HTC M8 telefono e Android 5.0 (API di livello 21 o superiore).
La soluzione è stata quella di aggiungere gli indirizzi dei dispositivi allo ScanFilter.
Se si lasciano i filtri vuoti, le richiamate di scansione non verranno richiamate.
Ecco il mio codice di lavoro:
public static final String TAG = "My_BLE_app";
public static final String DEVICE_1 = "D4:BE:84:72:5B:8E";
public static final String DEVICE_2 = "C4:39:07:19:60:E2";
private Context mContext;
private BluetoothAdapter mBluetoothAdapter;
private BluetoothLeScanner mScanner;
private ScanSettings mSettings;
private List<ScanFilter> mFilters = new ArrayList<ScanFilter>();
In primo luogo il metodo di inizializzazione BLE:
public boolean init() {
BluetoothManager bluetoothManager = (BluetoothManager) mContext.getSystemService(Context.BLUETOOTH_SERVICE);
mBluetoothAdapter = bluetoothManager.getAdapter();
if (mBluetoothAdapter == null)
return false;
mScanner = mBluetoothAdapter.getBluetoothLeScanner();
mSettings = new ScanSettings.Builder().setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY).build();
mFilters.add(new ScanFilter.Builder().setDeviceAddress(DEVICE_1).build());
mFilters.add(new ScanFilter.Builder().setDeviceAddress(DEVICE_2).build());
return mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE);
}
E poi i callback di scansione:
private ScanCallback mDirectedScanCallback = new ScanCallback() {
@Override
public void onScanResult(int callbackType, ScanResult result) {
processResult(result);
}
@Override
public void onBatchScanResults(List<ScanResult> results) {
for (ScanResult result: results) {
processResult(result);
}
}
private void processResult(ScanResult result) {
BluetoothDevice device = result.getDevice();
if (device == null)
return;
String address = device.getAddress();
if (!BluetoothAdapter.checkBluetoothAddress(address))
return;
int rssi = result.getRssi();
Log.d(TAG, "address=" + address + ", rssi=" + rssi);
// TODO connect to the device in under 1 second
}
};
Infine, il codice per avviare la scansione :
mScanner.startScan(mFilters, mSettings, mDirectedScanCallback);
Una domanda è ancora aperta anche se:
Non so come individuare il tipo di scansione sul lato Android - cioè se la scansione è stato diretto oppure no.
fonte
2015-08-13 17:43:23