*********************************************** ***********************************
*** решено ******************************************* ************************
*********************************************** ***********************************
Хорошо, я нашел решение ... Я уже давал все разрешения, как
«BLUETOOTH_ADMIN», «BLUETOOTH», «ACCESS_COARSE_LOCATION» в манифесте, а также я уже проверял все разрешения в своей функции MainActivity.
Но я не знаю, почему я обнаружил, что, если я вручную добавлю разрешение «Доступ к моему местоположению», обратный вызов сканирования начнет работать.
Итак, теперь я собираюсь реализовать запрос на разрешение внутри моей MainActivity перед тем, как запустить сервис.
Это странно, потому что у меня не было той же проблемы в другом приложении, в котором я выполняю сканирование BLE внутри MainActivity; мое другое приложение, в котором я сканирую внутри MainActivity, не запрашивало это конкретное разрешение, ему просто нужны разрешения «BLUETOOTH» и «BLUETOOTH_ADMIN».
Похоже, что «Доступ к моему местоположению» необходим только в том случае, если сканирование будет работать в фоновом режиме.
(я попробовал это на своем устройстве "Huawei P8 Lite" с версией Android "8.0.0")
*********************************************** ***********************************
Я уже попробовал «BluetoothLeScanner» внутри упражнения и не обнаружил никаких проблем во время сканирования.
Но теперь, когда я переместил операцию сканирования в службу, у меня возникла проблема.
Это мой сервис:
public class BLEService extends Service {
private static final int SCAN_TIME_MILLIS = 5000;
private static final String MY_MAC = "00:15:85:10:85:3C";
private Handler mHandler;
private BluetoothAdapter mBluetoothAdapter;
private BluetoothLeScanner mScanner;
private ScanCallback mScanCallback;
private BluetoothGatt mBluetoothGatt;
private BluetoothGattCallback mGattCallback;
private int mTxpower;
@Override
public void onCreate() {
super.onCreate();
mHandler = new Handler();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
initAll();
startScan();
return START_STICKY;
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
private void startScan(){
mScanner.startScan(mScanCallback);
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
stopScan();
}
}, SCAN_TIME_MILLIS);
}
private void stopScan(){
mScanner.stopScan(mScanCallback);
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
startScan();
}
}, SCAN_TIME_MILLIS);
}
private void initAll(){
initBluetoothAdapter();
initBluetoothLeScanner();
initBluetoothScanCallback();
initGattCallback();
}
private void initBluetoothAdapter(){
final BluetoothManager bluetoothManager = (BluetoothManager) getBaseContext().getSystemService(Context.BLUETOOTH_SERVICE);
mBluetoothAdapter = bluetoothManager.getAdapter();
mBluetoothAdapter.startDiscovery();
}
private void initBluetoothLeScanner(){
mScanner = mBluetoothAdapter.getBluetoothLeScanner();
}
private void initBluetoothScanCallback(){
mScanCallback = 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);
}
};
}
private void initGattCallback(){
mGattCallback = new BluetoothGattCallback() {
@Override
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
super.onConnectionStateChange(gatt, status, newState);
}
@Override
public void onReadRemoteRssi(BluetoothGatt gatt, int rssi, int status) {
super.onReadRemoteRssi(gatt, rssi, status);
}
};
}
}
Когда я использую метод "startScan ()", если я просматриваю логи, я вижу, что Сканер был зарегистрирован правильно:
Адаптер I / Bluetooth: getBluetoothLeScanner
Адаптер D / Bluetooth: isLeEnabled (): ВКЛ.
D / BluetoothLeScanner: onScannerRegistered () - статус = 0 scannerId = 7 mScannerId = 0
Таким образом, похоже, что сканирование начинается правильно, но если я пытаюсь отладить обратный вызов сканирования, оно никогда не достигнет моих точек останова.
Кто-нибудь может мне помочь, пожалуйста?
Спасибо: D