2015-05-13 9 views
12

L'obiettivo è leggere i valori di un cardiofrequenzimetro LE bluetooth.startLeScan sostituzione a corrente corrente

Usando campioni di Google, ottengo

private void scanLeDevice(final boolean enable) { 
    if (enable) { 
     // Stops scanning after a pre-defined scan period. 
     mHandler.postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       mScanning = false; 
       mBluetoothAdapter.stopLeScan(mLeScanCallback); 
      } 
     }, SCAN_PERIOD); 

     mScanning = true; 
     mBluetoothAdapter.startLeScan(mLeScanCallback); 
    } else { 
     mScanning = false; 
     mBluetoothAdapter.stopLeScan(mLeScanCallback); 
    } 
} 

che provoca mBluetoothAdapter.stopLeScan a essere indicato come deprecato. Startscan non è tuttavia un metodo di mBluetoothAdapter.

Come modificarlo perché funzioni con l'API corrente?

+3

dopo un anno lo stesso campione è ancora deprecato, perché non fare un aggiornamento? .. – user3290180

+0

Buon punto, quando lavoro in Google, terrò la documentazione aggiornata. Sono arrivato qui perché non riesco a trovare come: p –

risposta

11

Entrambi i metodi BluetoothAdapter.startLeScan e BluetoothAdapter.stopLeScan sono stati deprecati in Android Lollipop. Come una sostituzione BluetoothLeScanner sono stati introdotti e agendo come un controller di scansione.

Se si sviluppa un'applicazione basata su BLE, è necessario controllare la scansione tramite BluetoothAdapter (Android 4.3 e Android 4.4) o BluetoothLeScanner. L'API introdotta in Android Lollipop offre funzionalità molto più grandi in termini di consumo di energia della batteria.

+0

Posso usare BluetoothLeScanner in Android 4.3 (compilare con Lollipop ma l'SDK minimo è impostato su 18)? – Felix

+2

@Fei è impossibile usare BluetoothLeScanner su OS versione inferiore a API 21.Questa classe semplicemente non sarà presente in Android SDK su quei dispositivi. Il tentativo di eseguire la scansione BLE su di essi genererà ClassNotFoundException generata. –

5

Utilizzare BluetoothAdapter.getBluetoothLeScanner() per ottenere un'istanza di BluetoothLeScanner.

Quindi, è possibile avviare o interrompere una scansione con i metodi startScan o stopScan, in modo simile alla versione deprecata.

La differenza è che è possibile passare filtri di scansione e impostazioni. ScanCallback ha più informazioni sui dispositivi trovati. I filtri consentono di filtrare i risultati di scansione in base a nome, macaddress, UUID di servizio, ecc. Le impostazioni di scansione consentono di controllare la potenza di scansione.

+0

Uso di 'import android.bluetooth.BluetoothAdapter;' Ho solo '.getDefaultAdapter()' e non '.getBluetoothLeScanner()'. Quindi non ho 'startScan' ma solo i metodi deprecati menzionati. –

+0

Hai SDK target impostato su 21? E hai un'istanza di BluetoothAdapter per ottenere BluetoothLeScanner? – JPS

5

Ricordate che il metodo:

public BluetoothLeScanner getBluetoothLeScanner() 

non è statica. Se lo fai:

BluetoothAdapter.getBluetoothLeScanner() 

si ottiene un errore, dal momento che getDefaultAdapter() è un metodo statico, ma getBluetoothLeScanner() non lo è.

È necessaria un'istanza di un BluetoothAdapter. È possibile ottenere uno facendo:

(BluetoothManager) mContext.getSystemService(Context.BLUETOOTH_SERVICE).getAdapter() 

In questo modo, si può provare:

Context mContext = getBaseContext(); 
BluetoothAdapter mAdapter = ((BluetoothManager) mContext.getSystemService(Context.BLUETOOTH_SERVICE)).getAdapter(); 
BluetoothLeScanner mLeScanner = mAdapter.getBluetoothLeScanner(); 

mLeScanner.startScan(...); 

Maggiori informazioni qui: http://developer.android.com/reference/android/bluetooth/BluetoothAdapter.html

9

Grazie a tutti per le vostre risposte. Per riassumere la risposta a questa domanda aggiungerò il mio frammento di codice finale.

private BluetoothAdapter mBluetoothAdapter; 


private ScanCallback mLeScanCallback = new ScanCallback() { 
    @Override 
    public void onScanResult(int callbackType, ScanResult result) { 
     super.onScanResult(callbackType, result); 
    } 

    @Override 
    public void onBatchScanResults(List<ScanResult> results) { 
     super.onBatchScanResults(results); 
    } 

    @Override 
    public void onScanFailed(int errorCode) { 
     super.onScanFailed(errorCode); 
    } 
}; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    BluetoothManager bluetoothManager = (BluetoothManager) getActivity().getSystemService(Context.BLUETOOTH_SERVICE); 
    mBluetoothAdapter = bluetoothManager.getAdapter(); 
} 


private void scanLeDevice(final boolean enable) { 

    final BluetoothLeScanner bluetoothLeScanner = mBluetoothAdapter.getBluetoothLeScanner(); 

    if (enable) { 
     // Stops scanning after a pre-defined scan period. 
     mHandler.postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       mScanning = false; 

       bluetoothLeScanner.stopScan(mLeScanCallback); 
      } 
     }, SCAN_PERIOD); 

     mScanning = true; 
     bluetoothLeScanner.startScan(mLeScanCallback); 
    } else { 
     mScanning = false; 
     bluetoothLeScanner.stopScan(mLeScanCallback); 
    } 
} 
3

Per evitare l'avviso. Basta controllare la versione dell'API prima di chiamare la funzione. È possibile utilizzare il codice

private BluetoothAdapter bluetoothAdapter; 
private BluetoothAdapter.LeScanCallback leScanCallback; 
private BluetoothAdapter.LeScanCallback leScanCallback; 
private ScanCallback scanCallback; 
private ScanSettings scanSetting; 

// Check before call the function 
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
      bluetoothAdapter.getBluetoothLeScanner().startScan(filterList, scanSetting, scanCallback); 
     } else { 
      bluetoothAdapter.startLeScan(leScanCallback); 
     }