我想创建一个能够接收音频流的Android应用程序。我曾想过使用A2DP配置文件,但似乎Android不支持A2DP接收器。看起来有很多人在寻找这个问题的解决方案。但是,如果接收一个普通的位流,然后在应用程序中将数据转换成音频呢?我想通过RFCOMM(SPP蓝牙模式)接收PCM或Mp3数据流,然后使用AudioTrack播放。
首先,我如何通过RFCOMM在我的Android手机上接收比特流?是否可以通过RFCOMM接收位流作为PCM或Mp3流?
其次,如果无法通过RFCOMM接收比特流作为PCM或Mp3流,如何将接收到的比特流转换为音频?
第三,如何将接收到的数据转换为音频,并“实时”同时播放音频?我可以用onDataReceived吗?
明确地说,我对使用A2DP配置文件不感兴趣!我想通过RFCOMM(SPP蓝牙配置文件)流式传输数据。接收到的数据流将在PCM或Mp3中。我想写我自己的应用程序,但如果有人知道解决这个问题的应用程序,我很高兴听到它!我正在使用Android 2.3姜饼。
/约翰尼
[不相关但有效]该黑客仅通过WIFI热点提供mp3流媒体服务(我在只有AUX输入的车上使用):
(不知道为什么只有“192.168.43.1”?因为这是任何连接到Android Hotspot的设备的默认网关)
另一个解决方法是使用免提模式。
在Android系统中,蓝牙耳机(BluetoothHeadset)正致力于此。等待状态更改为BluetoothHeadset。STATE\u AUDIO\u已连接。
然后您可以从蓝牙耳机录制音频。
mMediaRecorder = new MediaRecorder();
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mMediaRecorder.setOutputFile(mFilename);
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
try {
mMediaRecorder.prepare();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
mMediaRecorder.start();
不。尝试编写一个处理这个问题的Android应用程序并不是解决方案。至少如果您想使用A2DP接收器角色。
事实上,正如你所提到的,Android没有实现对BlueZ的API调用(Android在Jelly Bean 4.1之前使用的蓝牙堆栈),这与A2DP接收器的功能有关。你必须自己实现它们。我会尽力引导你们,因为我在不久的过去也对自己做这件事感兴趣。
默认情况下,支持蓝牙功能的Android设备将自己作为A2DP源设备进行宣传。您必须先更改此设置,以便附近的设备可能会将您的设备识别为接收器。为此,必须修改音频。conf文件(通常位于/etc/bluetooth/)并确保存在“启用”键,并且该键附带了值“源”,因此您将得到如下结果:
Enable=Source
重新启动后,附近的设备现在应该会将您的设备识别为A2DP接收器。
现在,当A2DP源设备开始将音频流传输到您的手机时,您必须与BlueZ进行交互,以做出适当的反应。
Android和BlueZ正在通过D-BUS
相互交谈。事实上,Android连接到DBUS_SYSTEM频道并收听每个BlueZ广告,例如事件、文件描述符...
我记得我使用本机应用程序成功地将自己绑定到这个d总线通道,并访问了BlueZ发布的各种事件。作为参考,这里提供的BlueZ API相对容易实现。如果您这样做,您将不得不构建一个本机应用程序(C/C),并为您的平台编译它。您必须能够使用Android NDK实现这一点。
如果您发现难以使用D-BUS,可以尝试我刚刚找到的Java库,它为您处理与D-BUS的通信:http://jbluez.sourceforge.net/.我从未使用过它,但在我看来值得一试。
您真正要做的是找出A2DP源设备何时与您的手机配对,以及他何时开始流式传输音乐。您可以通过D-BUS检索这些事件。一旦有人尝试流式传输音乐,您需要告诉BlueZ您的本机应用程序将处理它。有一个非常好的文档解释了您应该处理的事件流。此文档可在此处访问。您感兴趣的部分位于第7页。给定示例中的接收器应用程序是PulseAudio
,但它也可能是您的应用程序。
当您调用org时,BlueZ将向您转发一个UNIX套接字。布鲁兹。媒体传输。获取方法。读取此套接字将为您提供远程设备当前传输的数据。但我记得有一个在BlueZ堆栈上工作的人告诉我,在这个套接字上读取的数据不是PCM纯音频,而是编码音频内容。数据通常以称为SBC(低复杂度子带编码)的格式进行编码。
解码SBC不是很难,你可以在这里找到一个解码器。
最终的步骤是将PCM音频转发到扬声器。
为了防止您陷入困境,并以更轻松的方式测试应用程序,您可以使用Android系统上应该提供的d-bus二进制文件。他位于/system/bin。
在执行上述任何操作之前,您可以进行快速测试:
获取设备列表:
dbus send—system—dest=org。bluez——打印回复/组织。布鲁兹。经理获取属性
这将返回一个适配器数组及其路径。一旦您有了这些路径,您就可以检索与您的适配器配对的所有蓝牙设备的列表。
获取配对设备:
dbus-send--system--print-reage--est=org.bluez /org/bluez/{pid}/hci0org.bluez.适配器
这将在设备阵列字段中显示配对设备的列表。
一旦您将设备列表配对到蓝牙适配器,您就可以知道它是否连接到音频源接口。
将设备连接到音频源接口:
dbus-send--system--print-reage--est=org.bluez /org/bluez/{pid}/hci0/dev_XX_XX_XX_XX_XX_XXorg.bluez.AudioSource. GetPropertiesorg.bluez.管理器. GetProperties
希望这有帮助。
我写了一个通过蓝牙发送/接收文件的应用程序,但我想把这个应用程序设置为默认的应用程序发送和接收文件! 移动设备向我的手机发送文件时的说明;我的应用程序获取文件,并与它一起工作之后,保存在我想要的时间和地点。
我想知道我们是否可以将2个蓝牙设备连接到Android设备,并在Android中实时共享数据?i、 e我有一个传感器连接到Android设备,我想流式传输或收听或广播从传感器接收到的数据到耳机(连接到同一个Android设备)。在Android中可能吗??请提出建议。提前谢谢。 我想通过经典蓝牙收听音频流。有可能把Android设备变成接收器吗?目前,我们使用HFP模式和经典蓝牙进行通信。 场景:
我正试图通过蓝牙将数据从一台设备传输到另一台设备。 我之前曾尝试在android网站上运行bluetoothChat示例代码,但没有成功。 现在,我继续研究我发现的这段代码,虽然它在我的设备上编译,但它们之间没有连接。 有人看到下面的代码有什么问题吗?如果有人知道android上蓝牙的一些好资源,如果他们能与我分享,我将不胜感激!
我正在尝试从与Android设备配对的蓝牙耳机中捕获音频。 以下是相关代码: 清单要求权限: WRITE_EXTERNAL_STORAGE RECORD_AUDIO 互联网 MODIFY_AUDIO_SETTINGS BROADCAST_STICKY 蓝牙 BLUETOOTH_ADMIN 每个应用程序的典型过滤LogCat输出是: 初始化BT 启动蓝牙 BT可以从麦克风录音吗?true 一切初始化
Hy,我们正在通过蓝牙开发android多人游戏。这是一款多人LUDO游戏,其中4名玩家相互连接并进行游戏。 我们被困在第三和第四名球员的连接。 上面是建立连接的示例代码。但是在连接服务类中,我们有以下代码 当移动设备连接到第三个或第四个设备时,它返回myBSock==null。但是如果代码正常工作,它必须返回设备的地址,并且应该将mBtDeviceAddresses.add(设备);添加到服务器
我想知道android蓝牙通信的通信方式是什么。我的代码基本上遵循这里的开发者指南:http://developer.android.com/guide/topics/connectivity/bluetooth.html如果我按照本指南从设备中读取/写入数据?通信类型是什么?我在网上搜索了一下,它看起来像是串口通信,RS 232。这是正确的吗? 非常感谢。