【问题标题】:How to create programmatically an A2DP connection or how can I emulate an Android phone to be an A2DP sink?如何以编程方式创建 A2DP 连接或如何将 Android 手机模拟为 A2DP 接收器?
【发布时间】:2011-04-11 15:33:00
【问题描述】:

我有两部安卓手机(三星 Galaxy Tab 和 HTC Desire)。两者都是 2.2。 Galaxy Tab 应该是 A2DP 接收器,而 Desire 是源。我的目标是将欲望的声音传到银河系。我刚刚在 API 中看到可以建立 RFCOMM 连接。但我想建立一个 A2DP 连接。我对解决方案的要求是任何手机都不应该被root。

我在源代码中找到了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 手机并从一部手机流式传输到另一部吗?您有其他方法吗?

谢谢

【问题讨论】:

    标签: android bluetooth uuid


    【解决方案1】:

    您不能在RFCOMM / SPP 上执行此操作 - 连接到A2DP UUID 是不够的 - 需要完成配置文件连接/配置文件级别协议程序才能实现A2DP - 更多的是A2DP 直接在L2CAP protocol 上工作(并且不需要RFCOMM)。

    您可能无法在两部手机之间手动执行此操作,因为要流式传输一个设备需要 A2DP 接收器和其他 A2DP 源,电话通常只是源设备(可以流式传输到接收器设备的流的源) , 接收器为HeadsetsBluetooth speakers

    【讨论】:

    • 是否有非官方的方式来扩展我的设备以支持 A2DP 接收器。我刚刚读到 Bluez 支持 A2DP 接收器。所以理论上我的设备可能是一个 A2DP 接收器,还是我需要一些特殊的硬件来扩展这个功能?或者在 audio.conf 文件中启用 Sink 支持就足够了吗?
    • 是的,您可以通过与 BlueZ 的 A2DP 接收器集成来扩展 Android - 我认为它不需要特殊的硬件。
    • 我该怎么做?如果我想扩展我的三星 Galaxy Tab,那么我应该获取获取 bluez 文件的源代码吗?之后我必须更改 bluez 堆栈中的某处以激活 A2DP 接收器,然后将我的自定义代码放在银河选项卡上?我是对的还是我完全错了?我必须为此编写驱动程序吗?我不知道如何将 A2DP 集成到 Galaxy Bluez Stack 中。请给我一些提示好吗?谢谢
    • @DennisMathews,是否可以从 android 连接到多个 a2dp 接收器?并向所有接收器播放相同的内容?
    猜你喜欢
    • 1970-01-01
    • 2014-03-13
    • 2019-03-11
    • 2012-04-28
    • 2017-11-23
    • 2019-02-18
    • 1970-01-01
    • 2015-03-02
    • 1970-01-01
    相关资源
    最近更新 更多