9

私は1つのインスタンスを持つサービスを持っていますBluetoothGattCallback

public class MyService extends Service {

    private BluetoothGattCallback callback;

    @Override
    public void onCreate() {
            super.onCreate();

            callback = new BluetoothGattCallback() {
                      @Override
                      public synchronized void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
                              Log.i("onConnectionStateChanged", "Status " + status);                
                              Log.i("onConnectionStateChanged", "New State " + newState);                
                      }
            };
    }

    // registration of bluetooth adapter and blah blah blah


}

アプリを起動すると、問題なく動作し、コールバックは 1 回だけ呼び出されますが、数回試行した後、2 回呼び出されます。

サンプルログ

10-22 13:29:18.731 26944-26961/redacted.lollipop I/onConnectionStateChange: Status 0
10-22 13:29:18.731 26944-26961/redacted.lollipop I/onConnectionStateChange: New State 2
10-22 13:29:18.731 26944-26961/redacted.lollipop I/onConnectionStateChange: Status 0
10-22 13:29:18.731 26944-26961/redacted.lollipop I/onConnectionStateChange: New State 2

その他のサンプル ログ

10-22 13:29:48.836 26944-26961/redacted.lollipop I/onConnectionStateChange: Status 8
10-22 13:29:48.836 26944-26961/redacted.lollipop I/onConnectionStateChange: New State 0
10-22 13:29:48.850 26944-30763/redacted.lollipop I/onConnectionStateChange: Status 8
10-22 13:29:48.850 26944-30763/redacted.lollipop I/onConnectionStateChange: New State 0

また、アプリがアクティブである時間が長くなるほど、より多くの回数が呼び出されます。これを防ぐにはどうすればよいですか?

4

1 に答える 1

23

覚えておくべきことの1つは、電話をかけるたびに

bluetoothDevice.connectGatt(context, true, callback);

bluetoothGatt オブジェクトの新しいインスタンスを作成します。表示されるこのソースのソースを確認してください。

         BluetoothGatt gatt = new BluetoothGatt(context, iGatt, this, transport);
         gatt.connect(autoConnect, callback);

したがって、1 つのトリッキーなことは、デバイスが切断され、再接続した場合です。connectGatt(コンテキスト、真、コールバック); 前の bluetoothGatt インスタンスで connect() を呼び出す代わりに、gatt コールバックへのハンドルを持つ 2 つの bluetoothGatt インスタンスを取得します。

最初は、再接続する前に bluetoothGatt を閉じて切断することで問題を解決しようとしていました。

   if (service.bluetoothGatt!=null){
        Log.i("Rides","Closeing bluetooth gatt on disconnect");
        service.bluetoothGatt.close();
        service.bluetoothGatt.disconnect();
        service.bluetoothGatt=null;
    } 

しかし、これはうまくいきませんでした。どういうわけか、複数の onConnectionStateChanged コールバックが発生しました。

有効な bluetoothGatt オブジェクトがあるかどうかを確認し、再接続の場合は connect() を呼び出すようにすることで、この問題を解決できました。

----更新された回答----

onConnectionStateChangedコールバック内で bluetoothGatt.close() を呼び出す方が良いことがわかりました。切断を発行すると、切断を要求するメッセージが Bluetooth デバイスに送信されます。次に、応答したらコールバックを取得し、Bluetooth gatt 接続を閉じます。コールバックを待機し、完全に閉じられるまで別の gatt 接続を開かないことで、複数の gatt オブジェクトがアプリに接続されるのを防ぐようです。

于 2016-07-08T23:39:49.127 に答える