2011-03-15 70 views
18

我正在尋找通過rfcomm套接字不安全地連接的方式。我能找到下面提到的方式如何在Android中創建不安全的RFCOMM套接字?

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

這暫且是做我想做的。即使通過here的文檔說我們需要使用createInsecureRfcommSocketToServiceRecord進行不安全的連接。但是沒有這樣的方法。我發現的唯一方法是使用如上所示的反射。即使在這個方法中,傳遞給createInsecureRfcommSocket而不是createInsecureRfcommSocketToServiceRecord。我只是想知道這種方式有多可靠。如果我在方法中提到createInsecureRfcommSocketToServiceRecord,連接永遠不會發生。

回答

29

createInsecureRfcommSocketToServiceRecord()被列入開始與Android API級別10,因此文檔會鼓勵你使用它,因爲文檔始終遵循最新版本的API。如果您的目標是低於10(a.k.a.2.3.3或薑餅)的API,則該方法不能公開訪問。

您通過反射調用的方法是BluetoothDevice內部的私有方法,自從大致Android 2.0以來已經存在。調用隱藏方法的問題在於,它們不能保證在所有設備上或將來都存在,所以您賭博了一下。我的猜測是,你的方法可能在大多數2.0+設備上大部分時間都可以工作,因爲在堆棧層實現其公共表弟createRfcommSocketToServiceRecord()所需的服務非常相似。底線,如果你想保證與你的藍牙實現的通用兼容性,你將不得不針對你的應用程序定位2.3.3(API等級10)。由於公開的API現在暴露在不安全的RFCOMM中,很難說底層私有實現或多或少可能改變。

+0

非常感謝我指向正確的方向。如果該API僅在API級別10後纔可用,那麼如果我正在使用Android 2.1 – sunil 2011-03-16 07:07:18

+3

ATM進行開發,那麼如何不安全地連接到設備,您已找到最佳折中方案。請記住,反射解決方案可能會在更高版本中消失,因此您可能希望編寫代碼以使用「Build.VERSION」檢查設備上的版本,並使用2.3和更高版本的公共API。這將要求您將目標API級別提高到10,但將最低API級別保留爲5(或7),以便它仍然可以在運行2.1或2.2的早期設備上運行。希望有所幫助! – Devunwired 2011-03-16 13:52:37

+0

@Wireless,但它可以在API 7中使用createInsecureRfcommSocketToServiceRecord()方法嗎? – 2011-07-27 07:43:59

0
+0

@丹尼斯馬修斯先生,我需要你看看這個鏈接 – 2011-08-08 05:15:31

+0

http://stackoverflow.com/questions/6872451/android-bluetooth-connection-issue – 2011-08-08 05:15:41

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); 

完蛋了!

+4

鏈接是404 – Rafay 2014-07-04 05:25:52