18

rfcommソケットを介して安全に接続する方法を検討しています。下記の方法を見つけることができました

Method m = device.getClass().getMethod("createInsecureRfcommSocket", new Class[] {int.class});
tmp = (BluetoothSocket) m.invoke(device, 1);

これは当分の間、私がやりたいことをやっています。ここにあるドキュメントでさえ、安全でない接続にはcreateInsecureRfcommSocketToServiceRecordを使用する必要があると書かれています。しかし、そのような方法はありません。私が見つけた唯一の方法は、上記のように反射を使用することでした。そして、その場合でも、createInsecureRfcommSocketToServiceRecordではなくcreateInsecureRfcommSocketで渡されるメソッド。この方法の信頼性を知りたかっただけです。メソッドでcreateInsecureRfcommSocketToServiceRecordについて言及した場合、接続は発生しません。

4

2 に答える 2

29

createInsecureRfcommSocketToServiceRecord()はAndroidAPIレベル10から含まれているため、ドキュメントは常に最新バージョンのAPIに準拠しているため、ドキュメントで使用することをお勧めします。10未満のAPI(別名2.3.3またはGingerbread)をターゲットにしている場合、そのメソッドは公開されていません。

リフレクションを介して呼び出しているメソッドは、 Android2.0以降に存在しているプラ​​イベートcreateInsecureRfcommSocket()メソッドです。BluetoothDevice非表示のメソッドを呼び出す際の問題は、すべてのデバイスに存在することが保証されていないことです。将来的には、少しギャンブルをしていることになります。createRfcommSocketToServiceRecord()私の推測では、パブリックいとこを実装するために必要なサービスはスタックレイヤーで非常に類似しているため、ほとんどの2.0以降のデバイスでほとんどの場合この方法が機能すると思います。

結論として、Bluetooth実装とのユニバーサル互換性を保証したい場合は、アプリケーションで2.3.3(APIレベル10)をターゲットにする必要があります。パブリックAPIが安全でないRFCOMMに公開されているため、基盤となるプライベート実装が変更される可能性が高いか低いかを判断するのは困難です。

于 2011-03-15T23:04:05.090 に答える
5

ここで回答された回答のほとんどは、この投稿の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);

それでおしまい !

于 2011-12-28T07:49:44.300 に答える