/**
* 蓝牙扫描管理类
*/
public class BleScannerManager {
public static final String TAG = "BleScannerManager";
/**
* 默认扫描间隔
*/
public static final long DEFAULT_SCAN_TIME = 12000;
/**
* 扫描间隔
*/
private long mScanCurrentTime = DEFAULT_SCAN_TIME;
private static BleScannerManager instance;
private final BluetoothAdapter mBluetoothAdapter;
private final Context mContext;
private BleListener mBleListener;
public static BleScannerManager getInstance(Context context) {
if (instance == null) {
synchronized (BleScannerManager.class) {
if (instance == null) {
instance = new BleScannerManager(context.getApplicationContext());
}
}
}
return instance;
}
private BleScannerManager(Context context) {
BluetoothManager bluetoothManager = (BluetoothManager) context.getSystemService(Context.BLUETOOTH_SERVICE);
mBluetoothAdapter = bluetoothManager.getAdapter();
this.mContext = context;
}
public void setBleListener(boolean start, BleListener bleListener) {
this.mBleListener = bleListener;
if (enableBluetooth() && start) {
startScan();
}
}
public static final boolean isGpsEnable(final Context context) {
LocationManager locationManager
= (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
boolean gps = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
boolean network = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
if (gps || network) {
return true;
}
return false;
}
/**
* 判断是否支持蓝牙设备
*
* @return
*/
private boolean isBluetoothValid() {
if (!mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {
if (mBleListener != null) {
mBleListener.onEnableFail("设备不支持蓝牙");
}
Log.e(TAG, " 设备不支持蓝牙");
return false;
}
if (mBluetoothAdapter == null) {
if (mBleListener != null) {
mBleListener.onEnableFail("获取蓝牙失败");
}
Log.e(TAG, " 获取蓝牙失败");
return false;
}
return true;
}
public boolean isBleOpen() {
if (!isBluetoothValid()) {
return false;
}
return mBluetoothAdapter.isEnabled();
}
public boolean closeBle() {
if (!isBluetoothValid()) {
return false;
}
return mBluetoothAdapter.disable();
}
public boolean enableBluetooth() {
if (!isBluetoothValid()) {
Log.e(TAG, " isBluetoothValid enableBluetooth");
return false;
}
try {
if (!mBluetoothAdapter.isEnabled()) {
if (mBluetoothAdapter.enable()) {
if (mBleListener != null) {
Log.e(TAG, " mBluetoothAdapter onEnableSuccess");
mBleListener.onEnableSuccess();
return true;
}
} else {
if (mBleListener != null) {
mBleListener.onEnableFail("打开蓝牙失败");
}
return false;
}
}
if (mBleListener != null) {
Log.e(TAG, "mBleListener onEnableSuccess");
mBleListener.onEnableSuccess();
}
return true;
} catch (Exception e) {
if (mBleListener != null) {
mBleListener.onEnableFail("打开蓝牙异常");
}
Log.e(TAG, "打开蓝牙异常");
}
return false;
}
private Handler mScanHandler;
public void startScan() {
if (mScanHandler == null) {
doScan();
}
if (mBleListener != null) {
mBleListener.onStartSearch();
}
}
private BluetoothAdapter.LeScanCallback mLeScanCallback;
private void doScan() {
if (mScanHandler == null) {
mScanHandler = new Handler(mContext.getMainLooper());
}
if (mLeScanCallback == null) {
mLeScanCallback = new LowScanCallback();
}
mBluetoothAdapter.stopLeScan(mLeScanCallback);
mBluetoothAdapter.startLeScan(mLeScanCallback);
mScanHandler.removeMessages(0);
mScanHandler.postDelayed(new Runnable() {
@Override
public void run() {
doScan();
}
}, mScanCurrentTime);
}
public void stopScan() {
if (mScanHandler != null) {
mScanHandler.removeMessages(0);
mScanHandler = null;
}
if (mBluetoothAdapter != null) {
mBluetoothAdapter.stopLeScan(mLeScanCallback);
}
if (mBleListener != null) {
mBleListener.onStopSearch();
}
mBleListener = null;
}
private class LowScanCallback implements BluetoothAdapter.LeScanCallback {
@Override
public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord) {
String name = device.getName();
ThreadUtils.postUI(new Runnable() {
@Override
public void run() {
if (mBleListener != null) {
mBleListener.LeScanResult(device);
}
}
});
}
}
interface BleListener {
void onStartSearch();
void LeScanResult(BluetoothDevice device);
void onStopSearch();
void onEnableSuccess();
void onEnableFail(String msg);
}
}