我正在研究一个有趣的项目,该项目涉及通过智能手机通过蓝牙混合流音频,从android开始,因为这是我最有经验的项目。 我曾经在android上使用过蓝牙一两次,根据我的经验,我知道蜂窝前API不允许应用程序连接到A2DP或HFP音频接收器。 我已经在HTC EVO的Ginger Bread上进行了尝试,使用了必要的UUID无济于事。

根据官方文档,从API LEVEL 11开始 ,这已经成为可能,但是我可以肯定,唯一提供此API级别的设备将是稍后的Ice Cream Sandwich设备,因为仅在Honey Comb中才开始支持。 我是一个业余爱好者,所以我不太可能很快就使用开发级的Ice Cream Sandwich设备。 因为我现在只是想证明概念,所以将任何代码修改为以后的版本都不会成为问题。

理想情况下,我想使用成对的A2DP设备的输入/输出流直接读取和写入PCM数据。 但是,如果我现在想执行此操作,则很有可能必须使用一种解决方法。

我的想法是使用android的AudioRecordAudioTrack类,根据我的理解, 这些类从麦克风读取音频输入并将音频输出推送到扬声器。 现在,在两种情况下,当未连接A2DP设备时,这些结构将分别使用设备的麦克风和扬声器。 但是,当连接A2DP或HFP设备时,我不知道系统现在是否将这些结构分别设置为输入和输出到耳机的麦克风和扬声器。 如果是这样,那么我可以将其有效地纳入我的代码中,并在以后进行修改以利用Ice Cream Sandwich的直接支持。

在这一领域具有相对丰富经验的人是否认为这种方法行得通? 在我坐下来编写可能会浪费时间的代码之前,我宁愿知道是否有人成功。

===============>>#1 票数:0

实际上,Android没有连接a2dp设备的官方API。

但是您可以使用反射来访问隐藏的类。 我在项目中使用了这种方式,并且可以在android 2.3到android 4.1上运行。

首先,您需要获取IBluetoothA2dp.aidl文件并将其放在项目文件夹src / com.android中
接下来,使用下面的方法获取IBluetoothA2dp接口:

private static IBluetoothA2dp getIBluetoothA2dp() {
    IBluetoothA2dp ibta = null;

    try {
        final Class serviceManager = Class.forName("android.os.ServiceManager");
        final Method getService = serviceManager.getDeclaredMethod("getService", String.class);
        final IBinder iBinder = (IBinder) getService.invoke(null, "bluetooth_a2dp");
        final Class iBluetoothA2dp = Class.forName("android.bluetooth.IBluetoothA2dp");
        final Class[] declaredClasses = iBluetoothA2dp.getDeclaredClasses();
        final Class c = declaredClasses[0];
        final Method asInterface = c.getDeclaredMethod("asInterface", IBinder.class);

        asInterface.setAccessible(true);
        ibta = (IBluetoothA2dp) asInterface.invoke(null, iBinder);
    } catch (final Exception e) {
        Log.e("Error " + e.getMessage());
    }
    return ibta;
}

然后,如果您的SDK <11,如果您的SDK在11到16之间,则只需调用a2dp.connectSink(btDevice)a2dp.connect(btDevice)即可

由于蓝牙堆栈已完全更改, 因此无法在Android 4.2上使用

  ask by Joey Carson translate from so

未解决问题?本站智能推荐:

2回复

拨动A2DP设备(Android)

我有两个配对的蓝牙设备(我的汽车用于手机音频的头部装置和用于A2DP的独立蓝牙接收器)。 在我的手机上有一个“用于媒体音频”的复选框,我必须手动切换我的A2DP输出才能转到我的汽车扬声器。 我的目标是以编程方式切换。 我尝试使用AudioManager类和不推荐使用的setBlueto
1回复

android上的a2dp sink的音质太差了。 我该如何解决?

我在这个站点上得到了很多帮助。 我曾修补Jelly bean Android,使其成为蓝牙的接收器。 如何修改Android的蓝牙堆栈以启用A2dp接收器 SNK有效! 但是音质不好! 有很多声音,例如声音失真。 您可以通过单击链接听到声音: http : //me2.do/5y
3回复

Android设备作为A2DP配置文件的接收器

基本上,我现在要做的是使用Android设备作为A2DP接收器,当配对建立时,android播放从发射器接收的声音。 我担心如果我使用STP配置文件,可能会导致流式传输延迟。 所以,我想使用A2DP,但是这可能使用Android设备作为A2DP的接收器吗? 怎么做?
1回复

如何在Android中启用A2DP接收器功能?

我正在开发一个使用Gingerbread 2.3.4作为操作系统的定制嵌入式设备。 现在,该设备应该能够播放来自其他支持A2DP的设备(如iPhone或其他Android设备)的音频流。 我知道Gingerbread包含Bluez堆栈4.69,它具有A2DP接收器功能。 但是,我怀疑And
1回复

在TTS的Android上禁用A2DP输出

我有一个连接到A2DP立体声扬声器的Android 4.1设备。 我的应用程序使用TTS(文本转语音)和AudioTrack类将自定义声音流式传输到扬声器。 是否可以将电话扬声器用于TTS。 例如: 声音流到A2DP设备 停止声音输出 切换到手机扬声器
1回复

在Android中,是否可以使用“ MODE_IN_COMMUNICATION”将音频路由到A2DP?

如果我将AudioManager模式设置为MODE_IN_COMMUNICATION,并将Media Player流设置为STREAM_VOICE_CALL,则可以将音频路由到扬声器或内置听筒扬声器。 并且,如果将其路由到内置扬声器,并且将有线耳机插入int,它将自动路由到该扬声器。 但是,
1回复

Android bluedroid stack-启用a2dp接收器-NDK应用程序

我正在尝试在Nexus-Android M中启用a2dp接收器配置文件。看起来可以通过设置/external/bluetooth/bluedroid/include/bt_target.h文件中存在的适当标志来启用对a2dp接收器的支持。 除了编译和刷新整个系统映像外,我是否可以拔出更新
4回复

如何修改Android的蓝牙堆栈以启用A2dp接收器

我正在制作一个录音机应用程序,它使用蓝牙麦克风将音频录制到Android设备上(Nexus 7 - 扎根Android 4.4.2)。 它目前在HFP上实施,一切正常。 蓝牙麦克风是用Bluegiga的WT32蓝牙模块+麦克风输入实现的,通过HFP的音质不是很好,但现在已足够了。 但是
2回复

需要在Android /非Android设备之间通过A2DP发送/接收音频的想法

我需要能够通过蓝牙发送和接收音频,似乎A2DP就是这样做的 使用这里给出的代码,我设法让我的手机检测并与远程蓝牙设备配对,然后建立A2DP连接,通过蓝牙将Android设备的所有音频输出发送到远程设备 我之前能够通过RFCOMM与同一个远程蓝牙设备进行这种双向数据通信(虽然Andro
1回复

将android设为a2dp接收器或带有蓝牙的直通音乐播放器

因此,首先,尽管这已经被问过,但是最近是否有任何更新允许您将设备更改为a2dp接收器而不是应用程序级别的源? 我想要的是创建一个可以在两部手机上使用的应用程序。 一个电话有音乐,然后通过蓝牙将其流式传输到电话,而电话又将其发送到蓝牙扬声器。 需要澄清的是,第二个电话不是在播放音乐,而只