安全にrfcommソケット経由で接続する方法を探しています。下記の方法を見つけることができました
Method m = device.getClass().getMethod("createInsecureRfcommSocket", new Class[] {int.class});
tmp = (BluetoothSocket) m.invoke(device, 1);
とりあえずこれは私がやりたいことをやっています。 here に関するドキュメントでさえ、安全でない接続にはcreateInsecureRfcommSocketToServiceRecordを使用する必要があると述べています。しかし、そのような方法はありません。私が見つけた唯一の方法は、上記のように反射を使用することでした。さらに、createInsecureRfcommSocketToServiceRecordではなく、createInsecureRfcommSocketで渡されるメソッドも含まれます。この方法の信頼性を知りたかっただけです。メソッドでcreateInsecureRfcommSocketToServiceRecordに言及した場合、接続は発生しません。
createInsecureRfcommSocketToServiceRecord()
は、Android APIレベル10以降に含まれているため、ドキュメントは常に最新バージョンのAPIに従っているため、ドキュメントを使用することをお勧めします。 APIが10(別名2.3.3またはGingerbread)より低い場合、そのメソッドは一般公開されません。
リフレクションを介して呼び出すメソッドcreateInsecureRfcommSocket()
は、おおよそAndroid 2.0以降に存在するBluetoothDevice
内のプライベートメソッドです。隠しメソッドの呼び出しに関する問題は、すべてのデバイスに存在すること、または将来的に存在することが保証されているわけではないので...あなたは少しギャンブルしています。私の推測では、ほとんどの2.0+デバイスでは、ほとんどの場合、このメソッドが機能します。パブリックいとこcreateRfcommSocketToServiceRecord()
を実装することは、スタックレイヤーで非常に似ています。
結論として、Bluetooth実装との互換性を保証したい場合は、アプリケーションで2.3.3(APIレベル10)をターゲットにする必要があります。安全でないRFCOMMに公開APIが公開されたため、基になるプライベート実装が変更される可能性が高いか低いかを判断するのは困難です。
ここで回答する回答のほとんどは、この投稿の2011年3月30日より前です。
私のアプリで同様の問題の解決策を探しているときに、3月30日に書かれたこのブログを見つけました。
それはまだこの問題の解決策をSOで探しているすべての人を助けるでしょう
http://mobisocial.stanford.edu/news/2011/03/bluetooth-reflection-and-legacy-nfc/
解決策は非常に簡単になりました。プロジェクトにInsecureBluetooth.Javaを含め、BluetoothChatService.Javaの2行を変更するだけです。
tmp = InsecureBluetooth.listenUsingRfcommWithServiceRecord(mAdapter, NAME, MY_UUID, true);
そして
tmp = InsecureBluetooth.createRfcommSocketToServiceRecord(device, MY_UUID, true);
それでおしまい !
これを見たことがありますか createInsecureRfcommSocketToServiceRecord