2013-02-09 15 views
7

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

<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" /> 

、問題のコード:

AndroidManifestは、これらの行が含ま

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%を返します。私が正しいことをしていないことはありますか?

答えて

0

まず、反射を使用しているのはなぜですか?それは私にとっては赤旗です。 APIを使用すると、ブルートゥース経由で他のデバイスと話すことができます。this linkを参照してください。反射を使用しないでください。

ソケットは、connectメソッドが呼び出される前に常に接続されずに戻ります。あなたのコードはソケットを取得しても、それと接続しようとはしません。まずthis methodに電話する必要があります。

+0

反射部分は、この質問に対する受け入れられた回答から来ました:http://stackoverflow.com/questions/3397071/service-discovery-failed-exception-using-bluetooth-on-android。私は反射という考えに驚いたわけではありませんが、元の質問からUUIDに頼ってはいけないということを他の場所で覚えていると思います。 私にとっての重要な問題は、答えの2番目の部分です。私は接続されているBTデバイスを見つけようとしており、自分で接続しようとしていません。それは不可能ですか?私は、BT状態の変化を監視するサービスを作成する必要がないようにしようとしています。 – jkane001

+0

Ameenは、SO答えとAndroidドキュメントをもっと慎重に読んだ後、ここで反射が必要ないことに気付きました。私はより良い "isConnected"メソッドで私の元の質問を更新しましたが、私の質問は残っています:BTデバイスが接続されていない状態で接続されているかどうかを検出する方法はありますか? – jkane001

2

私はjkane001が既に彼の問題を解決していると信じていますので、この回答が他の人に役立つことを願っています。

すべてのソケット作成後

socket = device.createRfcommSocketToServiceRecord(SPP_UUID); 

の最初のconnect()方法があるので、あなたがsocket.isConnected()

を使用して接続状態を確認することができるでしょうその後はあなたが

socket.connect(); 

で接続を初期化するものブロックされていないので、ソケットがまだ接続されていない可能性があります。私はちなみにこの

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

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

+0

私は、信号が弱いために接続が失われた後、isConnected()が呼び出された場合でもTrueを返すことが分かりました。だから私はソケットに何かを送り、例外をキャッチすることに頼ってきました。 – VectorVictor

+0

@VectorVictorが正しい。 isConnected()は、接続が有効かどうかを確認する信頼できる方法ではありません。 – Alex

2

はどうやら無用よりデバイスおよび/またはをisConnected()が実装されているAndroidのバージョン(すなわち、関数が存在し、あなたがそれを呼び出すことができます)が、より悪いがあります。私はこの動作を示すAndroid 4.2.2を実行している私のデスクにAlcatelの電話を持っています。

私のコードは、接続が切断されていると想定されていたので、接続スレッドを強制終了しました。これは私を長い間夢中にしていました。しかし、私はisConnected()呼び出しを削除し、それが接続されていると仮定し、すべて正常に動作します!私は、エラーを待って接続が死んでいると宣言する以外に、有効な接続を確認する良い方法は見つけられませんでした。スレッド内のブロックされたread()は最終的に失敗します。

私たちは、同じようなサウンドとバージョンを知っている2つの問題のデバイスのうちの2つが4.2.2にあるという報告をフィールドから得ました。修正プログラムをまだ配備していないので、まだそれらのケースを修正したかどうかはわかりません。

関連する問題