我打电话给我的蓝牙适配器mBluetoothAdapter.startDiscovery();然后返回一个BluetoothDevices列表.当我按下其中一个设备时,我这样做:
mBluetoothGatt = bluetoothDevice.connectGatt(MainActivity.this,false,mGattCallback);
我的回调是:
private final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { @Override public void onConnectionStateChange(BluetoothGatt gatt,int status,int newState) { if (newState == BluetoothProfile.STATE_CONNECTED) { mConnectionState = STATE_CONNECTED; Log.i(TAG,"Connected to GATT server."); Log.i(TAG,"Attempting to start service discovery:" + mBluetoothGatt.discoverServices()); List<BluetoothGattService> listBGS = mBluetoothGatt.getServices(); Log.i("","list size: " + listBGS.size()); } else if (newState == BluetoothProfile.STATE_DISCONNECTED) { mConnectionState = STATE_DISCONNECTED; Log.i(TAG,"Disconnected from GATT server."); } } @Override // New services discovered public void onServicesDiscovered(BluetoothGatt gatt,int status) { if (status == BluetoothGatt.GATT_SUCCESS) { Log.w(TAG,"onServicesDiscovered GATT_SUCCESS: " + status); List<BluetoothGattService> listBGS = mBluetoothGatt.getServices(); Log.i("","list size: " + listBGS.size()); } else { Log.w(TAG,"onServicesDiscovered received: " + status); } } @Override // Result of a characteristic read operation public void onCharacteristicRead(BluetoothGatt gatt,BluetoothGattCharacteristic characteristic,"onCharacteristicRead GATT_SUCCESS: " + status + " / char: " + characteristic); } } };
现在,当我在手机上试用它时,我在onConnectionStateChange上获得了STATE_CONNECTED,然后我调用了discoverServices,然后我返回了一个GATT_SUCCESS onServicesDiscoveres.所以我可以从我的服务中取出uuids.
但是当我在信标上尝试它时,我回到STATE_CONNECTED,当我调用discoverServices时,我得到一个状态代码:129 – > GATT_INTERNAL_ERROR
为什么我的信标会发生这种情况?还有另外一种方法,我怎么能拿设备uuid?
对于beaconManager,我只需要UUID能够执行此操作:
try { beaconManager.startMonitoringBeaconsInRegion(new Region("myMonitoringUniqueId",null,null)); } catch (RemoteException e) { }
编辑
我知道灯塔应该问我配对的代码,但事实并非如此.为什么?
我尝试添加此代码:
final IntentFilter pairingRequestFilter = new IntentFilter(BluetoothDevice.ACTION_PAIRING_REQUEST); pairingRequestFilter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY - 1); registerReceiver(mPairingRequestRecevier,pairingRequestFilter);
但我仍然没有得到配对和输入密码的请求
这是我的pairingRequestReceiver:
private final BroadcastReceiver mPairingRequestRecevier = new BroadcastReceiver() { @Override public void onReceive(Context context,Intent intent) { if (BluetoothDevice.ACTION_PAIRING_REQUEST.equals(intent.getAction())) { final BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); int type = intent.getIntExtra(BluetoothDevice.EXTRA_PAIRING_VARIANT,BluetoothDevice.ERROR); if (type == BluetoothDevice.PAIRING_VARIANT_PIN) { device.setPin(intToByteArray(123456)); abortBroadcast(); } else { Log.e("","Unexpected pairing type: " + type); } } } };
解决方法
经过几个小时的试验和错误,我确实设法找到一种方法让它像这样工作:
1.我开始发现相同,但当我选择蓝牙设备时,我要求与它绑定(配对):
1.我开始发现相同,但当我选择蓝牙设备时,我要求与它绑定(配对):
private void pairDevice(BluetoothDevice device) { try { Method method = device.getClass().getMethod("createBond",(Class[]) null); method.invoke(device,(Object[]) null); } catch (Exception e) { e.printStackTrace(); } }
我有一个ACTION_BOND_STATE_CHANGED接收器:
private final BroadcastReceiver mPairReceiver = new BroadcastReceiver() { public void onReceive(Context context,Intent intent) { String action = intent.getAction(); if (BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(action)) { final int state = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE,BluetoothDevice.ERROR); final int prevState = intent.getIntExtra(BluetoothDevice.EXTRA_PREVIoUS_BOND_STATE,BluetoothDevice.ERROR); if (state == BluetoothDevice.BOND_BONDED && prevState == BluetoothDevice.BOND_BONDING) { Log.i("","Paired"); mBluetoothGatt = btDevice.connectGatt(MainActivity.this,mGattCallback); } else if (state == BluetoothDevice.BOND_NONE && prevState == BluetoothDevice.BOND_BONDED){ Log.i("","Unpaired"); } } } };
我注册的是这样的:
IntentFilter intent = new IntentFilter(BluetoothDevice.ACTION_BOND_STATE_CHANGED); registerReceiver(mPairReceiver,intent);
只有在此之后,我才尝试连接我的BluetoothGattCallback.因此,我可以发现服务,等等