**********************************************************************************
**********************************************************************************
好吧,我找到了解决办法。。。我已经给了所有的权限
但我不知道为什么我发现,如果我手动添加“访问我的位置”权限,扫描回调就开始工作了。
所以现在我要在启动服务之前在MainActivity中实现权限请求。
这很奇怪,因为我在MainActivity内部执行BLE扫描的其他应用程序中没有遇到相同的问题;我在MainActivity中扫描的另一个应用程序没有请求这个特定的权限,它只需要“BLUETOOTH”和“BLUETOOTH”管理权限。
(我在我的设备“华为P8 Lite”上试用了Android版本“8.0.0”)
我已经在一个活动中试用了“蓝牙扫描器”,扫描过程中没有发现任何问题。
这是我的服务:
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);
}
};
}
}
I/蓝牙适配器:getBluetoothLeScanner
D/BluetoothLeScanner:onScannerRegistered()-状态=0 scannerId=7 mScannerId=0
所以看起来扫描是正确开始的,但是如果我尝试调试扫描的回调,它就永远不会到达断点。