AndroidのBluetooth接続の検出

そのため、私の前に、ペアリングされたデバイスのいずれかが現在Bluetooth経由で私の電話に接続されているかどうかをプログラムで判断するというタスクがありました。 このテーマに関する既成のソリューションをネットワーク上で長時間検索しましたが、失敗しましたが、見つける距離は、Bluetoothを介して接続イベントを追跡できることを示すだけです。 しかし、プログラムはイベントの後に起動することができます、したがって、これは私に適合しませんでした。



実際、その後(および公式のAndroidドキュメントのBluetoothのセクションをスクロールして)、各ペアリングされたデバイスとの接続を試行し、操作の成功を確認するようになりました:成功した場合は、デバイスがカバレッジエリアにあり、接続されていることを意味します アイデアは成功しました。

ただし、その実装に至るまでにまだ問題がありました。

BluetoothSocket bs = device.createRfcommSocketToServiceRecord(MY_UUID); bs.connect();
      
      





このクライアント接続作成コードは、いかなる方法でも実行されることを望まず、常に「Service discovery failed」エラーを返しました。 繰り返しますが、同じ問題に関する多くの苦情の事実を検索し、読み、明らかにします。 この問題を解決するためのヒントは、MY_UUIDに異なる値を提供するという1つに要約されました。 これらのヒントからN番目の異なるUUIDを試しましたが、Windows MobileとAndroid間の接続を取得できませんでした。 興味深い点:「スリープ」しているWMコミュニケーターに接続しようとすると、ディスプレイが点灯します。 つまり、接続はまだ初期化されていますが、何らかの理由で確立されていません。 同胞は解決策を見つけた:

 Method m = device.getClass().getMethod("createRfcommSocket",new Class[] { int.class }); socket = (BluetoothSocket)m.invoke(device, Integer.valueOf(1));
      
      





そして、この方法は本当に完璧に機能します。



一般的なBluetooth接続確認コードは次のようになります。

 boolean checkConnected() { BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); boolean connected = false; for (BluetoothDevice device : mBluetoothAdapter.getBondedDevices()) { try { try { Method m = device.getClass().getMethod("createRfcommSocket",new Class[] { int.class }); try { BluetoothSocket bs = (BluetoothSocket) m.invoke(device,Integer.valueOf(1)); bs.connect(); connected = true; Log.d(TAG, device.getName() + " - connected"); break; } catch (IOException e) { Log.e(TAG, "IOException: "+e.getLocalizedMessage()); Log.d(TAG, device.getName() + " - not connected"); } } catch (IllegalArgumentException e) { Log.e(TAG, "IllegalArgumentException: "+e.getLocalizedMessage()); } catch (IllegalAccessException e) { Log.e(TAG, "IllegalAccessException: "+e.getLocalizedMessage()); } catch (InvocationTargetException e) { Log.e(TAG, "InvocationTargetException: "+e.getLocalizedMessage()); } } catch (SecurityException e) { Log.e(TAG, "SecurityException: "+e.getLocalizedMessage()); } catch (NoSuchMethodException e) { Log.e(TAG, "NoSuchMethodException: "+e.getLocalizedMessage()); } } return connected; }
      
      





もちろん、コードは非常に速く動作しません。 それでも、特に他の解決策が見つからなかったため、コードは機能し、その機能を実行します。 Androidでの私の経験がそれほど大きくないという事実のために、おそらくコードに修正する何か他のものがあるか、他の解決策があります。 しかし、専門家はすでにそれを促すでしょう。



All Articles