2011-04-11 53 views
5

我有兩個Android手機(三星Galaxy Tab和HTC Desire)。 2.2。 Galaxy Tab應該是一個A2DP接收器,Desire的源頭。我的目標是將慾望的聲音傳播到銀河系。我剛剛在API中看到可以建立一個RFCOMM連接。但我想建立一個A2DP連接。我對解決方案的要求是沒有任何電話應該紮根。如何以編程方式創建A2DP連接,或者如何模擬Android手機成爲A2DP接收器?

我在源代碼中發現了Bluetooth UUID這個類。我試圖用UUID打開一個A2DP連接。

這是服務器側的代碼:

客戶端的
private class AcceptThread extends Thread { 
    public AcceptThread() { 
     try { 
     BluetoothServerSocket mmServerSocket = btAdapter.listenUsingRfcommWithServiceRecord("Audio Sink", UUID.fromString("0000110B-0000-1000-8000-00805F9B34FB")); // UUID of Audio sink 
     mmServerSocket = btAdapter.listenUsingRfcommWithServiceRecord(
    "AVCRP Controller", UUID.fromString("0000110E-0000-1000-8000-00805F9B34FB")); // UUID of AVCRP Controller     

    } catch (IOException e) { 
    } 
} 

    public void run() { 
// Keep listening until exception occurs or a socket is returned 
while (true) { 
try { 
     socket = mmServerSocket.accept(); 

} catch (IOException e) { 
    break; 
} 
// If a connection was accepted 
if (socket != null) { 
    try { 
    mmServerSocket.close(); 
} catch (IOException e) { 
    e.printStackTrace(); 
    } 

代碼:

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

我能夠配對兩個設備並且可以創建連接。如果我進入Desire的藍牙設置並長按Galaxy Tab,我有菜單選項。我可以看到媒體檔案。然後,如果試圖以檢查接線盒到設備與所選配置文件我得到以下日誌連接:

04-11 17:21:18.994: DEBUG/DTUN_HCID4(1233):   dtun_client_get_remote_services() 
04-11 17:21:18.994: INFO/DTUN_HCID4(1233): dtun_client_get_remote_services: Get remote services on 
04-11 17:21:18.994: INFO/DTUN_CLNT(1233):  Client calling DTUN_METHOD_DM_GET_REMOTE_SERVICES (id 5) 
04-11 17:21:18.994: INFO/(1220): DTUN_ReceiveCtrlMsg: [DTUN] Received message [BTLIF_DTUN_METHOD_CALL] 4354 
04-11 17:21:18.994: INFO/(1220): handle_method_call: handle_method_call :: received DTUN_METHOD_DM_GET_REMOTE_SERVICES (id 5), len 6 
04-11 17:21:18.994: ERROR/BTLD(1220): ****************search UUID = 1108*********** 
04-11 17:21:18.994: WARN/BTLD(1220): ccb timer ticks: 0 
04-11 17:21:19.005: INFO//system/bin/btld(1219):   btapp_dm_GetRemoteServices() 
04-11 17:21:19.005: INFO//system/bin/btld(1219): ##### USerial_Ioctl: BT_Wake, 0x8003 #### 
04-11 17:21:19.125: WARN/BTLD(1220): process_service_search_attr_rsp 
04-11 17:21:19.144: WARN/BTLD(1220): ccb timer ticks: 0 
04-11 17:21:19.155: ERROR/BTLD(1220): ****************search UUID = 111e*********** 
04-11 17:21:19.155: WARN/BTLD(1220): ccb timer ticks: 0 
04-11 17:21:19.287: WARN/BTLD(1220): process_service_search_attr_rsp 
04-11 17:21:19.287: WARN/BTLD(1220): ccb timer ticks: 0 
04-11 17:21:19.336: ERROR/BTLD(1220): ****************search UUID = 110b*********** 
04-11 17:21:19.336: WARN/BTLD(1220): ccb timer ticks: 0 
04-11 17:21:19.474: WARN/BTLD(1220): process_service_search_attr_rsp 
04-11 17:21:19.474: WARN/BTLD(1220): ccb timer ticks: 0 
04-11 17:21:19.534: INFO/BTL-IFS(1220): send_ctrl_msg: [BTL_IFS CTRL] send BTLIF_DTUN_SIGNAL_EVT (CTRL) 14 pbytes (hdl 15) 
04-11 17:21:19.534: INFO/DTUN_HCID4(1233): dtun_dm_sig_rmt_services: success=1, service=00040040 
04-11 17:21:19.534: DEBUG/DTUN_HCID4(1233): Adding UUID 0000111E-0000-1000-8000-00805F9B34FB 
04-11 17:21:19.534: DEBUG/DEVICE(1233): Just add the profiles for /org/bluez/1233/hci0/dev_xx_xx_xx_xx_xx_xx 
04-11 17:21:19.534: INFO/DTUN_HCID4(1233): Adding uuid 0000111E-0000-1000-8000-00805F9B34FB 
04-11 17:21:19.534: DEBUG/DTUN_HCID4(1233): Adding UUID 0000110B-0000-1000-8000-00805F9B34FB 
04-11 17:21:19.534: DEBUG/DEVICE(1233): Just add the profiles for /org/bluez/1233/hci0/dev_xx_xx_xx_x_xx_xx 
04-11 17:21:19.534: INFO/DTUN_HCID4(1233): Adding uuid 0000110B-0000-1000-8000-00805F9B34FB 
04-11 17:21:19.534: INFO/DTUN_HCID4(1233): Calling sink_init 
04-11 17:21:19.534: DEBUG/ADAPTER(1233): adapter_get_device(Xx:xx:xx:xx:xx:xx) 
04-11 17:21:19.534: DEBUG/DEVICE(1233): btd_device_ref(0xfa10): ref=2 
04-11 17:21:19.534: INFO/DTUN_HCID4(1233): sink_init 
04-11 17:21:19.534: DEBUG/DTUN_HCID4(1233): Registered interface org.bluez.AudioSink on path /org/bluez/1233/hci0/dev_xx_xx_xx_xx_xx_xx 
04-11 17:21:19.544: ERROR/BluetoothEventLoop.cpp(96): event_filter: Received signal org.bluez.Device:PropertyChanged from /org/bluez/1233/hci0/dev_xx_xx_xx_xx_xx_xx 
04-11 17:21:19.544: DEBUG/BluetoothService(96): updateDeviceServiceChannelCache(xx:xx:xx:xx:xx:xx) 
04-11 17:21:19.554: INFO/DEVICE(1233): pattern = 0000111e-0000-1000-8000-00805f9b34fb, id = 4 
04-11 17:21:19.564: DEBUG/BluetoothService(96):  uuid(system): 0000111e-0000-1000-8000-00805f9b34fb 4382 
04-11 17:21:19.574: VERBOSE/BluetoothEventRedirector(492): Received android.bleutooth.device.action.UUID 
04-11 17:21:19.700: WARN/BTLD(1220): ccb timer ticks: 0 
04-11 17:21:20.615: INFO//system/bin/btld(1219): ##### USerial_Ioctl: BT_Sleep, 0x8004 #### 
04-11 17:21:24.634: DEBUG/dalvikvm(594): GC_EXPLICIT freed 46 objects/2320 bytes in 50ms 
04-11 17:21:24.675: INFO/System.out(1336): public android.bluetooth.BluetoothA2dp(android.content.Context) 
04-11 17:21:24.684: DEBUG/BluetoothA2dpService(96): connectSink(xx:xx:xx:xx:xx:xx) 
04-11 17:21:24.684: INFO/BluetoothA2dpService(96): checkSinkSuspendState() : state = 1 prevState = 0 
04-11 17:21:24.684: INFO/BluetoothA2dpService(96): checkSinkSuspendState() : mTargetA2dpState = -1 
04-11 17:21:24.684: INFO/BluetoothA2dpService(96): checkSinkSuspendState() : initialStart = false initialSuspend = false 
04-11 17:21:24.694: VERBOSE/BluetoothEventRedirector(492): Received android.bluetooth.a2dp.action.SINK_STATE_CHANGED 
04-11 17:21:24.694: DEBUG/CachedBluetoothDevice(492): onProfileStateChanged:[] 
04-11 17:21:24.705: DEBUG/BluetoothA2dpService(96): A2DP state : device: BC:47:60:0F:4B:F3 State:0->1 
04-11 17:21:24.705: INFO/DTUN_CLNT(1233):  Client calling DTUN_METHOD_AM_AV_OPEN (id 20) 
04-11 17:21:24.705: INFO/(1220): DTUN_ReceiveCtrlMsg: [DTUN] Received message [BTLIF_DTUN_METHOD_CALL] 4354 
04-11 17:21:24.705: INFO/(1220): handle_method_call: handle_method_call :: received DTUN_METHOD_AM_AV_OPEN (id 20), len 6 
04-11 17:21:24.705: ERROR/BTLD(1220): reset flags 
04-11 17:21:24.705: WARN/BTLD(1220): ccb timer ticks: 0 
04-11 17:21:24.705: DEBUG/DTUN_HCID4(1233): stream creation in progress 
04-11 17:21:24.714: INFO//system/bin/btld(1219): ##### USerial_Ioctl: BT_Wake, 0x8003 #### 
04-11 17:21:24.958: WARN/BTLD(1220): process_service_search_attr_rsp 
04-11 17:21:25.017: WARN/BTLD(1220): ccb timer ticks: 0 
04-11 17:21:25.227: ERROR/BTLD(1220): bta_av_rc_create ACP handle exist for shdl:0 
04-11 17:21:25.325: WARN/BTLD(1220): bta_dm_rm_cback:0, status:1 
04-11 17:21:25.325: WARN/BTLD(1220): bta_dm_act no entry for connected service cbs 
04-11 17:21:25.325: INFO/BTL-IFS(1220): send_ctrl_msg: [BTL_IFS CTRL] send BTLIF_DTUN_SIGNAL_EVT (CTRL) 44 pbytes (hdl 15) 
04-11 17:21:25.325: WARN/BTLD(1220): btui_av_callback(BTA_AV_OPEN_EVT::FAILED (page-timeout or protocol)::status: 3 
04-11 17:21:25.325: INFO/DTUN_HCID4(1233): pending 
04-11 17:21:25.325: INFO/DTUN_HCID4(1233): orig_msg = e588 
04-11 17:21:25.325: ERROR/BluetoothA2dpService.cpp(96): onConnectSinkResult: D-Bus error: org.bluez.Error.Failed (Stream connection failed) 
04-11 17:21:25.325: INFO/BluetoothA2dpService(96): checkSinkSuspendState() : state = 0 prevState = 1 
04-11 17:21:25.325: INFO/BluetoothA2dpService(96): checkSinkSuspendState() : mTargetA2dpState = -1 
04-11 17:21:25.325: INFO/BluetoothA2dpService(96): checkSinkSuspendState() : initialStart = false initialSuspend = false 
04-11 17:21:25.334: VERBOSE/BluetoothEventRedirector(492): Received android.bluetooth.a2dp.action.SINK_STATE_CHANGED 
04-11 17:21:25.334: INFO/BluetoothEventRedirector(492): Failed to connect BT A2DP 
04-11 17:21:25.334: DEBUG/CachedBluetoothDevice(492): onProfileStateChanged:[] 
04-11 17:21:25.334: DEBUG/BluetoothA2dpService(96): A2DP state : device: BC:47:60:0F:4B:F3 State:1->0 
04-11 17:21:25.925: INFO//system/bin/btld(1219): ##### USerial_Ioctl: BT_Sleep, 0x8004 #### 
04-11 17:21:26.775: WARN/BTLD(1220): ccb timer ticks: 2147483648 
04-11 17:21:26.785: INFO//system/bin/btld(1219): ##### USerial_Ioctl: BT_Wake, 0x8003 #### 
04-11 17:21:27.725: INFO//system/bin/btld(1219): ##### USerial_Ioctl: BT_Sleep, 0x8004 #### 

有誰知道我做錯了嗎? 一個普遍的問題是,有可能通過藍牙連接兩部Android手機,並從一部手機傳輸到另一部手機?你有其他方法嗎?

感謝

回答

10

你不能這樣做了RFCOMM/SPP - 連接到A2DP UUID是不夠的 - 配置文件連接/ profile文件級協議的程序需要完成,以實現A2DP - 更多超過A2DP直接作用在L2CAP protocol(和不要求RFCOMM)。

您可能無法在兩部手機之間手動執行此操作,這也是因爲要傳輸一個設備需要是A2DP接收器和其他其他A2DP源,電話通常只有源設備(可以流式傳輸的流源設備),接收器是HeadsetsBluetooth speakers

+0

感謝您的幫助。這節省了我很多時間。 – user679935 2011-04-12 13:02:10

+2

有沒有一種非官方的方式來擴展我的設備以支持A2DP接收器。我剛剛讀到Bluez支持A2DP接收器。那麼理論上我的設備可能是A2DP接收器,還是我需要一些特殊的硬件來擴展這個功能?或者是否足以在audio.conf文件中啓用Sink支持? – user679935 2011-04-13 08:16:53

+2

是的,你可以通過整合來自BlueZ的A2DP接收器來擴展Android - 我不認爲它需要特殊的硬件。 – 2011-04-13 15:25:39

相關問題