6

SPP プロファイルと bluetooth バージョン 2.1 の bluetooth デバイスがあります。
そのデバイスに接続して通信するアプリがあります。このデバイスは、「Just Works」ペアリング技術を使用しています。

Samsung Galaxy タブレット、Galaxy S などの特定の携帯電話で問題に直面しています。

問題は、ユーザーがアプリを終了した後、ソケットを閉じてデバイスから切断していることです。切断に成功すると、ペアリングされたデバイスのリストからデバイスのエントリが削除されます。

4

3 に答える 3

13

私はタブレットで作業したことはありませんが、Android フォン用の SPP を使用するアプリを作成しました。私が見つけたのは、Bluetooth を安定させるには、通信したいデバイスと手動で結合する必要があるということでした。以下のコードを使用して、アプリ内からボンディングを開始しました。設定メニューから手動でペアリングした場合と同様に、ボンディングが保持されます。

一般的なフローは次のとおりです。 1) BluetoothDevice.ACTION_BOND_STATE_CHANGED をリッスンする BroadcastReceiver を登録し
ます。 2) デバイスの検出後、BluetoothDevice オブジェクトが必要です。
3) リフレクションを使用して BluetoothDeviceObject の「createBond」メソッドを呼び出します
3a) ソケットを開く前に結合状態変更イベントを待ちます

BluetoothDevice device = {obtained from device discovery};
Method m = device.getClass().getMethod("createBond", (Class[])null);
m.invoke(device, (Object[])null);

int bondState = device.getBondState();
if (bondState == BluetoothDevice.BOND_NONE || bondState == BluetoothDevice.BOND_BONDING)
{
    waitingForBonding = true; // Class variable used later in the broadcast receiver

    // Also...I have the whole bluetooth session running on a thread.  This was a key point for me.  If the bond state is not BOND_BONDED, I wait here.  Then see the snippets below
    synchronized(this)
    {
        wait();
    }
}

4) 結合状態が BOND_BONDING から BOND_BONDED に変わるのを待ちます。

BroadcastReceiver の内部:

public void onReceive(Context context, Intent intent)
{
    if (BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(intent.getAction()))
    {
        int prevBondState = intent.getIntExtra(BluetoothDevice.EXTRA_PREVIOUS_BOND_STATE, -1);
        int bondState = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE, -1);

        if (waitingForBonding)
        {
            if (prevBondState == BluetoothDevice.BOND_BONDING)
            {
                // check for both BONDED and NONE here because in some error cases the bonding fails and we need to fail gracefully.
                if (bondState == BluetoothDevice.BOND_BONDED || bondState == BluetoothDevice.BOND_NONE)
                {
                    // safely notify your thread to continue
                }
            }
        }
    }
}

5) ソケットを開いて通信する

リフレクションを介して「removeBond」メソッドを使用して、デバイスをペアリング リストから削除することもできます。

お役に立てれば!

于 2011-11-18T20:24:38.980 に答える
0

Sony Xperia X10 でも同じ問題が発生しました。Bluetoothデバイス側のセキュリティレベル設定を変更することで、ペアリングを「記憶」させることができました(デバイスも開発しているため)。

「一時的なペアリング」の説明についてはよくわかりませんが、それはメーカーによって異なります。同じデバイスとの接続に対して異なる電話が異なる反応を示すことはあまり意味がありません.

しかし、私にとって問題なのは、境界のない部分です。通常、アプリケーションがバックグラウンドで接続されているときにユーザーがデバイスのペアリングを解除すると、Bluetooth スタックがクラッシュするようです。ACTION_BOND_STATE_CHANGED イベントを適切に管理する方法がまだわかりません。

于 2011-12-07T21:50:20.447 に答える
0

アプリの接続の結果としてペアリングが発生している場合、一部のデバイスはそれを一時的なペアリングと見なし、接続が切断された後はデバイスをペアリング リストに保持しないと推測しています。デバイスをペアリング リストに保持するには、Bluetooth 設定メニューから手動でペアリングする必要があります。ペアリングすると、プログラムは接続/切断でき、デバイスはペアリング リストに保持されます。

于 2011-11-12T16:05:57.970 に答える