Android 8.1 连接到 BLE 外设调用 connectGatt。回调总是说断开连接。从不连接

Android 8.1 connecting to a BLE peripheral calling connectGatt. Callback always says disconnected. Never connects

我是 Android 编程新手,正在尝试编写可与 BLE 外围设备配合使用的应用程序。我有一个我编写的 iOS 应用程序,它做同样的事情,我的 iOS 应用程序已经按照我想要的方式工作。

我写了一个 activity 来扫描我的外围设备列表。到目前为止这似乎工作正常。

然后我 select 一个外围设备并将 BluetoothDevice 对象传递给一个 "device details" activity 它应该连接到外围设备然后用它做一些事情。

在我的设备详细信息 activity 中,我获取了对连接按钮的引用,然后添加了一个点击侦听器。单击侦听器创建 MyBluetoothGattCallback 的实例,然后将其用作调用 connectGatt() 的参数。此调用 return 看起来像一个有效的 BluetoothGatt 对象。调用了MyBluetoothGattCallback,但是只调用了一次,状态为133,状态为0。那好像是BluetoothProfile.STATE_DISCONNECTED。回调不会再被调用。每次我按下连接按钮时都会发生这种情况。

我已经确保只进行一次扫描操作,并且已从应用程序的主 activity 中停止。所以此时没有进行扫描。

我的问题是我应该做些什么来让连接正常工作?

public class DeviceDetails extends AppCompatActivity {

public BluetoothDevice mBluetoothDevice;
public BluetoothSocket mBluetoothSocket;
public BGXBluetoothGattCallback mGattCallback;
public BluetoothGatt mBluetoothGatt;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_device_details);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    TextView titleTextView = findViewById(R.id.DeviceDetailsTitleTextView);

    mBluetoothDevice = (BluetoothDevice) getIntent().getExtras().getParcelable("BLUETOOTH_DEVICE");
    String sdeviceName = mBluetoothDevice.getName();
    if (null == sdeviceName) {
        sdeviceName = "No device name";
    }

    titleTextView.setText(sdeviceName);

    Button connectButton = findViewById(R.id.connectButton);
    connectButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.d("debug", "Connect button pressed");
            if (null == mGattCallback) {
                mGattCallback = new MyBluetoothGattCallback();
            }

            mBluetoothGatt = mBluetoothDevice.connectGatt(DeviceDetails.this, false, mGattCallback);

        }
    });
}

这是我的 BluetoothGattCallback 子类:

public class MyBluetoothGattCallback extends BluetoothGattCallback {
@Override
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
    super.onConnectionStateChange(gatt,status,newState);

    Log.d("debug", "onConnectionStateChange status: " + status + " newState: "+newState);

    switch(newState) {
        case BluetoothProfile.STATE_CONNECTING:
            Log.d("debug", "connection state: CONNECTING.");
            break;
        case BluetoothProfile.STATE_CONNECTED:
            Log.d("debug", "connection state: CONNECTED.");
            break;
        case BluetoothProfile.STATE_DISCONNECTING:
            Log.d("debug", "connection state: DISCONNECTING.");
            break;
        case BluetoothProfile.STATE_DISCONNECTED:
            Log.d("debug", "connection state: DISCONNECTED.");
            break;
        default:
            Log.d("debug", "connection state: OTHER.");
            break;
    }
}

@Override
public void onServicesDiscovered(BluetoothGatt gatt, int status) {
    super.onServicesDiscovered(gatt, status);
    Log.d("debug", "onServicesDiscovered.");
    }
}

事实证明,导致所见结果的这段代码没有任何问题。我清除了嵌入式设备的绑定信息,重新启动 phone 然后它连接,发现服务等