这对我来说效果很好,
我有一个方法叫discoverBLEdevices,在onCreate中调用。
@SuppressLint("NewApi")
private void discoverBLEDevices() {
// TODO Auto-generated method stub
startScan.run();
Log.e("BLE_Scanner", "DiscoverBLE");
}
我有一个startScanRunnable,我在其中启动扫描并调用另一个runnable来停止扫描,如下所示:
private Runnable startScan = new Runnable() {
@Override
public void run() {
scanHandler.postDelayed(stopScan, 500);
mBLEAdapter.startLeScan(mLeScanCallback);
Log.e("BLE_Scanner", "Start Scan");
}
};
500 毫秒后,我调用了一个名为 stopScan 的可运行对象,它会停止扫描并再次调用 startScan 可运行对象。
private Runnable stopScan = new Runnable() {
@Override
public void run() {
mBLEAdapter.stopLeScan(mLeScanCallback);
scanHandler.postDelayed(startScan, 10);
Log.e("BLE_Scanner", "Stop Scan");
}
};
我的回调如下:
// Device scan callback.
@SuppressLint("NewApi")
private BluetoothAdapter.LeScanCallback mLeScanCallback = new BluetoothAdapter.LeScanCallback() {
@SuppressLint("NewApi")
public void onLeScan(final BluetoothDevice device, int rssi,
byte[] scanRecord) {
String Address = device.getAddress();
String Name = device.getName();
Log.e("mLeScanCallback",""+Address +" : "+Name);
}
};
整个代码:
import android.annotation.SuppressLint;
import android.app.Service;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothManager;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.util.Log;
import android.widget.Toast;
@SuppressLint("NewApi")
public class BluetoothLE extends Service {
private BluetoothAdapter mBLEAdapter;
private BluetoothManager manager;
private Handler scanHandler = new Handler();
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
turnonBLE();
discoverBLEDevices();
}
@SuppressLint("NewApi")
private void turnonBLE() {
// TODO Auto-generated method stub
manager = (BluetoothManager) getSystemService(BLUETOOTH_SERVICE);
mBLEAdapter = manager.getAdapter();
mBLEAdapter.enable();
Toast.makeText(getApplicationContext(), "BTLE ON Service",
Toast.LENGTH_LONG).show();
Log.e("BLE_Scanner", "TurnOnBLE");}
@SuppressLint("NewApi")
private void discoverBLEDevices() {
// TODO Auto-generated method stub
startScan.run();
Log.e("BLE_Scanner", "DiscoverBLE");
}
private Runnable startScan = new Runnable() {
@Override
public void run() {
scanHandler.postDelayed(stopScan, 500);
mBLEAdapter.startLeScan(mLeScanCallback);
}
};
// Device scan callback.
@SuppressLint("NewApi")
private BluetoothAdapter.LeScanCallback mLeScanCallback = new BluetoothAdapter.LeScanCallback() {
@SuppressLint("NewApi")
public void onLeScan(final BluetoothDevice device, int rssi,
byte[] scanRecord) {
String Address = device.getAddress();
String Name = device.getName();
Log.e("mLeScanCallback",""+Address +" : "+Name);
}
};
private Runnable stopScan = new Runnable() {
@Override
public void run() {
mBLEAdapter.stopLeScan(mLeScanCallback);
scanHandler.postDelayed(startScan, 10);
}
};
}