2011-11-21 157 views
3

我已經寫了一個android應用程序,使用藍牙從外部傳感器獲取數據。它在索尼愛立信XPERIA上工作正常,但不是在HTC Hero(它發現外部設備,但它無法從它們獲取任何數據),我想知道爲什麼。在網絡上進行了一些研究之後,我還沒有發現任何線索。 任何人在HTC上都有類似的藍牙問題?HTC英雄藍牙問題

+0

你的英雄在運行什麼API級別? – Jack

+0

感謝您的回覆。 這款HTC運行的是Android 2.1,因此它的API級別爲7. 我想我需要提升平臺。對? – user1058169

回答

2

如果我沒記錯的話,HTC手機在某個API級別(可能是2.1或更低?)有問題。決議是反思。

參考

Disconnect a bluetooth socket in Android

Service discovery failed exception using Bluetooth on Android

代替使用

tmp = device.createRfcommSocketToServiceRecord(MY_UUID); 

使用

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

獲得使用某個API級別某些HTC手機的BluetoothSocket的。

解決方案擴展

我最近有一個應用程序,我不得不考慮到這一點,我不喜歡在非HTC的手機用這個,所以我有一個條件,以檢查HTC,如果屬實然後使用反射,否則不要。

public BTConnectThread(BluetoothDevice device) { 

    mmDevice = device; 
    BluetoothSocket tmp = null; 

    // Get a BluetoothSocket for a connection with the given BluetoothDevice 
    if (isAnHTCDevice()) 
    { 
     try 
     { 
      Method m = device.getClass().getMethod("createRfcommSocket", new Class[] {int.class}); 
      tmp = (BluetoothSocket) m.invoke(device, Integer.valueOf(1)); 
     } 
     catch (Exception e) 
     { 
      Log.e(BCTAG, "Error at HTC/createRfcommSocket: " + e); 
      e.printStackTrace(); 
      handler.sendMessage(handler.obtainMessage(MSG_BT_LOG_MESSAGE, "Exception creating htc socket: " + e)); 
     } 
    } 
    else 
    { 
     try 
     { 
      UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); 
      tmp = device.createRfcommSocketToServiceRecord(MY_UUID); 
     } catch (Exception e) 
     { 
      Log.e(BCTAG, "Error at createRfcommSocketToServiceRecord: " + e); 
      e.printStackTrace(); 
      handler.sendMessage(handler.obtainMessage(MSG_BT_LOG_MESSAGE, "Exception creating socket: " + e)); 
     } 
    } 

    mmSocket = tmp; 
} 

isAnHTCDevice():

public boolean isAnHTCDevice() 
{ 
    String manufacturer = android.os.Build.MANUFACTURER; 
    if (manufacturer.toLowerCase().contains("htc")) 
     return true; 
    else 
     return false; 
} 
+0

非常感謝您的回答傑克, 不幸的是,我仍然無法打開套接字連接,代碼卡在該部分:tmp =(BluetoothSocket)m.invoke(device,1); 反射顯然不起作用,但我會將手機從2.1升級到最新版本。 如果有效,我會及時通知您。 – user1058169

+1

也許'1'應該被稱爲Integet.valueOf(1)。你確定你想要RFComm端口1嗎? –

1

你可以把它像這樣:

private final String PBAP_UUID = "0000112f-0000-1000-8000-00805f9b34fb"; //standard pbap uuid 

mSocket = mDevice.createInsecureRfcommSocketToServiceRecord(ParcelUuid.fromString(PBAP_UUID).getUuid()); 

mSocket.connect();

只要做到這一點。

1

你可以把它像這樣:

private final String PBAP_UUID = "0000112f-0000-1000-8000-00805f9b34fb"; //standard pbap uuid    
mSocket = mDevice.createInsecureRfcommSocketToServiceRecord(ParcelUuid.fromString(PBAP_UUID).getUuid())  
mSocket.connect(); 

只要做到這一點。