1

(非オーディオ) デバイスとの Bluetooth 接続がいつ失われたかを確実に検出できるかどうかを調べようとしています。Android SDK には、次のスニペットを使用する Bluetooth チャットの例が用意されています。

public void run() {
    Log.i(TAG, "BEGIN mConnectedThread");
    byte[] buffer = new byte[1024];
    int bytes;

    // Keep listening to the InputStream while connected
    while (true) {
        try {
            // Read from the InputStream
            bytes = mmInStream.read(buffer);

            // Send the obtained bytes to the UI Activity
            mHandler.obtainMessage(BluetoothChat.MESSAGE_READ, bytes, -1, buffer)
                    .sendToTarget();
        } catch (IOException e) {
            Log.e(TAG, "disconnected", e);
            connectionLost();
            break;
        }
    }
}

スレッドを開始し、アプリを使用せずに 12 時間後にデバイスを切断したときのこの方法の信頼性 (サービスはバックグラウンドで実行されます)。もちろん、サービスは常に殺される可能性がありますか?

その後、放送があります。アプリは常にこれらのブロードキャストを受信しますか? いつそうならないの?AndroidManifest でこれを使用して実装しようとしました:

    <receiver android:name="MyReceiver" >
        <intent-filter>
            <action android:name="android.bluetooth.device.action.ACL_CONNECTED" />
            <action android:name="android.bluetooth.device.action.ACL_DISCONNECT_REQUESTED" />
            <action android:name="android.bluetooth.device.action.ACL_DISCONNECTED" />
        </intent-filter>
    </receiver>

短期間で両方の方法をテストしましたが、どちらも機能します。前に述べたように、電話が長時間アイドル状態の場合、これらが信頼できるかどうかはわかりません.

誰がこれに光を当てることができますか?

4

1 に答える 1

1

Bluetooth 内のすべてのアクティビティには、タイムアウトが関連付けられています。デバイスによって異なります。

Bluetooth サービスは、有効にしている限りバックグラウンドで実行されます。ACL [Asynchronous Connection Less] パケットは、一般的に非音声関連データの転送に適用されます。ACL は、2 つの Bluetooth デバイス間の接続チャネルと同じです。これは、非アクティブ タイマーまたはタイムアウト値に基づいて切断される場合があります。

HCI createConnection API が呼び出されたときに設定された接続タイムアウトを読み取ることができます。この情報は、hcidump ツールを実行することで取得できます。http://www.bluez.org/download/

于 2013-01-15T12:42:44.800 に答える