Android 8.1 подключается к BLE-периферии, вызывая connectGatt. Обратный звонок всегда говорит отключен. Никогда не соединяется - PullRequest
0 голосов
/ 27 апреля 2018

Я новичок в программировании на Android и пытаюсь написать приложение, которое работает с периферийным устройством BLE. У меня есть приложение для iOS, которое я написал, которое делает то же самое, и мое приложение для iOS уже работает так, как я хочу.

Я написал действие, которое просматривает список моих периферийных устройств. Кажется, до сих пор это работает нормально.

Затем я выбираю периферийное устройство и передаю объект BluetoothDevice операции «Сведения об устройстве», которая должна подключаться к периферийному устройству, а затем выполняю с ней некоторые действия.

В своей работе с данными об устройстве я беру ссылку на кнопку подключения, а затем добавляю прослушиватель кликов. Слушатель щелчка создает экземпляр MyBluetoothGattCallback, а затем использует его в качестве параметра для вызова connectGatt (). Этот вызов возвращает то, что выглядит как действительный объект BluetoothGatt. MyBluetoothGattCallback вызывается, но он вызывается только один раз, и его состояние равно 133, а состояние равно 0. Похоже, что это BluetoothProfile.STATE_DISCONNECTED. Обратный вызов никогда не вызывается снова. Это происходит каждый раз, когда я нажимаю кнопку подключения.

Я уже убедился, что выполняется одна и только одна операция сканирования и что она остановлена ​​из основного действия приложения. Таким образом, сканирование не происходит в этот момент.

Мой вопрос: что я должен делать по-другому, чтобы соединение работало?

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.");
    }
}

1 Ответ

0 голосов
/ 27 апреля 2018

Оказывается, в этом коде не было ничего плохого, что привело к полученному результату. Я удалил информацию о связывании со встроенного устройства, перезагрузил телефон, а затем он подключился, обнаружил службы и т. Д.

...