好,我找到了解决方案...我已经授予了所有权限,例如 清单中的“ BLUETOOTH_ADMIN”,“ BLUETOOTH”,“ ACCESS_COARSE_LOCATION”,而且我已经在MainActivity中检查了所有权限。 但是我不知道为什么我发现,如果我手动添加“访问我的位置”权限,则“扫描回叫”将开始起作用。 因此,现在在启动服务之前,我将在MainActivity中实现权限请求。 这很奇怪,因为在MainActivity中进行BLE扫描的其他应用程序中,我没有遇到相同的问题;我在MainActivity中扫描的其他应用没有请求此特定权限,它只需要“ BLUETOOTH”和“ BLUETOOTH_ADMIN”权限。 因此,看起来只有在扫描要在后台运行时才需要“访问我的位置”。
((我在Android版本为“ 8.0.0”的设备“ Huawei P8 Lite”中进行了尝试)
我已经在一个活动中尝试了“ 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 / BluetoothAdapter:getBluetoothLeScanner
D / BluetoothAdapter:isLeEnabled():打开
D / BluetoothLeScanner:onScannerRegistered()-status = 0扫描器ID = 7 mScannerId = 0
因此,看来扫描开始正确,但是,如果我尝试调试扫描的回调,它将永远不会到达断点。 有人可以帮我吗?
谢谢:D