BleScanner.java 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. package com.clj.fastble.scan;
  2. import android.annotation.TargetApi;
  3. import android.os.Build;
  4. import android.os.Handler;
  5. import android.os.Looper;
  6. import com.clj.fastble.BleManager;
  7. import com.clj.fastble.callback.BleScanAndConnectCallback;
  8. import com.clj.fastble.callback.BleScanCallback;
  9. import com.clj.fastble.callback.BleScanPresenterImp;
  10. import com.clj.fastble.data.BleDevice;
  11. import com.clj.fastble.data.BleScanState;
  12. import com.clj.fastble.utils.BleLog;
  13. import java.util.List;
  14. import java.util.UUID;
  15. @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
  16. public class BleScanner {
  17. public static BleScanner getInstance() {
  18. return BleScannerHolder.sBleScanner;
  19. }
  20. private static class BleScannerHolder {
  21. private static final BleScanner sBleScanner = new BleScanner();
  22. }
  23. private BleScanState mBleScanState = BleScanState.STATE_IDLE;
  24. private final BleScanPresenter mBleScanPresenter = new BleScanPresenter() {
  25. @Override
  26. public void onScanStarted(boolean success) {
  27. BleScanPresenterImp callback = mBleScanPresenter.getBleScanPresenterImp();
  28. if (callback != null) {
  29. callback.onScanStarted(success);
  30. }
  31. }
  32. @Override
  33. public void onLeScan(BleDevice bleDevice) {
  34. if (mBleScanPresenter.ismNeedConnect()) {
  35. BleScanAndConnectCallback callback = (BleScanAndConnectCallback)
  36. mBleScanPresenter.getBleScanPresenterImp();
  37. if (callback != null) {
  38. callback.onLeScan(bleDevice);
  39. }
  40. } else {
  41. BleScanCallback callback = (BleScanCallback) mBleScanPresenter.getBleScanPresenterImp();
  42. if (callback != null) {
  43. callback.onLeScan(bleDevice);
  44. }
  45. }
  46. }
  47. @Override
  48. public void onScanning(BleDevice result) {
  49. BleScanPresenterImp callback = mBleScanPresenter.getBleScanPresenterImp();
  50. if (callback != null) {
  51. callback.onScanning(result);
  52. }
  53. }
  54. @Override
  55. public void onScanFinished(List<BleDevice> bleDeviceList) {
  56. if (mBleScanPresenter.ismNeedConnect()) {
  57. final BleScanAndConnectCallback callback = (BleScanAndConnectCallback)
  58. mBleScanPresenter.getBleScanPresenterImp();
  59. if (bleDeviceList == null || bleDeviceList.size() < 1) {
  60. if (callback != null) {
  61. callback.onScanFinished(null);
  62. }
  63. } else {
  64. if (callback != null) {
  65. callback.onScanFinished(bleDeviceList.get(0));
  66. }
  67. final List<BleDevice> list = bleDeviceList;
  68. new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
  69. @Override
  70. public void run() {
  71. BleManager.getInstance().connect(list.get(0), callback);
  72. }
  73. }, 100);
  74. }
  75. } else {
  76. BleScanCallback callback = (BleScanCallback) mBleScanPresenter.getBleScanPresenterImp();
  77. if (callback != null) {
  78. callback.onScanFinished(bleDeviceList);
  79. }
  80. }
  81. }
  82. };
  83. public void scan(UUID[] serviceUuids, String[] names, String mac, boolean fuzzy,
  84. long timeOut, final BleScanCallback callback,boolean isCanRepeatFound) {
  85. startLeScan(serviceUuids, names, mac, fuzzy, false, timeOut, callback,isCanRepeatFound);
  86. }
  87. public void scanAndConnect(UUID[] serviceUuids, String[] names, String mac, boolean fuzzy,
  88. long timeOut, BleScanAndConnectCallback callback) {
  89. startLeScan(serviceUuids, names, mac, fuzzy, true, timeOut, callback,false);
  90. }
  91. private synchronized void startLeScan(UUID[] serviceUuids, String[] names, String mac, boolean fuzzy,
  92. boolean needConnect, long timeOut, BleScanPresenterImp imp,boolean isCanRepeatFound) {
  93. if (mBleScanState != BleScanState.STATE_IDLE) {
  94. BleLog.w("scan action already exists, complete the previous scan action first");
  95. if (imp != null) {
  96. imp.onScanStarted(false);
  97. }
  98. return;
  99. }
  100. mBleScanPresenter.prepare(names, mac, fuzzy, needConnect, timeOut, imp,isCanRepeatFound);
  101. boolean success = BleManager.getInstance().getBluetoothAdapter()
  102. .startLeScan(serviceUuids, mBleScanPresenter);
  103. mBleScanState = success ? BleScanState.STATE_SCANNING : BleScanState.STATE_IDLE;
  104. mBleScanPresenter.notifyScanStarted(success);
  105. }
  106. public synchronized void stopLeScan() {
  107. BleManager.getInstance().getBluetoothAdapter().stopLeScan(mBleScanPresenter);
  108. mBleScanState = BleScanState.STATE_IDLE;
  109. mBleScanPresenter.notifyScanStopped();
  110. }
  111. public BleScanState getScanState() {
  112. return mBleScanState;
  113. }
  114. }