8

Bluetooth デバイスが現在 API 14 以上を使用して Android デバイスに接続されているかどうかを検出しようとしています。BluetoothSocket.isConnected() メソッドを使用できるように思われますが、何をしても、これまでのところ、接続されているかどうかにかかわらず、何も返されません。

AndroidManifest には次の行が含まれます。

<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />

<!-- Locale 4.x supports API 14 or greater. -->
<uses-sdk android:minSdkVersion="14" android:targetSdkVersion="17" />

<uses-feature android:name="android.hardware.bluetooth" />

そして問題のコード:

protected void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices();

    for (BluetoothDevice device : pairedDevices) {
        Log.i(Constants.LOG_TAG, String.format(Locale.US, "Device: %s connected: %b", device.getName(), isConnected(device))); //$NON-NLS-1$z
    }
}

private boolean isConnected(BluetoothDevice device) {
    BluetoothSocket socket = null;

    // Get a BluetoothSocket for a connection with the given BluetoothDevice
    UUID SPP_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
    try {
        socket = device.createRfcommSocketToServiceRecord(SPP_UUID);
    } catch (IOException e) {
        Log.e(Constants.LOG_TAG, e.getMessage()); //$NON-NLS-1$z
        return false;
    }

    Log.i(Constants.LOG_TAG, socket.toString()); //$NON-NLS-1$z

    return socket.isConnected();
}

エラーはスローされず、100% の確率で単に "false" が返されます。私が正しくやっていないことがありますか?

4

3 に答える 3

3

jkane001 さんはすでに問題を解決していると思いますので、この回答が誰かの役に立てば幸いです。

まずはソケット作成後

socket = device.createRfcommSocketToServiceRecord(SPP_UUID);

あなたはによって接続を開始しなければなりません

socket.connect();

その後、次を使用して接続状態を確認できますsocket.isConnected()

メソッドはブロッキングしていないためconnect()、直後のソケットはまだ接続されていない可能性があります。このようなものを使用することをお勧めします

while(!socket.isConnected() && trial++ < 3){
    try {
        Thread.sleep(300);
    } catch (Exception e) {}
}

ところで、一部の Android デバイスisConnected()では常に false が返されることがわかりました。そのような場合は、ソケットに何かを書き込んで、例外がないかどうかを確認してください。

于 2014-07-06T10:19:19.953 に答える
0

まず、なぜリフレクションを使用しているのですか?! それは私にとって危険信号です。API を使用すると、Bluetooth 経由で別のデバイスと通信できます。このリンクを参照してください。リフレクションは使用しないでください。

ソケットは、そのconnectメソッドが呼び出される前に常に接続されていないことを返します。あなたのコードはソケットを取得しているようですが、それとの接続を試みることはありません。最初にこのメソッドを呼び出す必要があります。

于 2013-02-09T22:06:53.107 に答える