我有一个Android设备充当使用hfp的免提客户端设备.
我能够接听电话,扬声器和麦克风按预期工作.
我的问题是我似乎无法控制音量.
我尝试使用以下代码行来查找正确的流,但它们似乎都不起作用.
我跟踪了从手机发送到类中客户端的音量命令HeadsetClientStateMachine,在以下链接中的#1822行:来自lolipop的HeadsetClientStateMachine
case EVENT_TYPE_VOLUME_CHANGED:
if (event.valueInt == HeadsetClientHalConstants.VOLUME_TYPE_SPK) {
mAudioManager.setStreamVolume(AudioManager.STREAM_BLUETOOTH_SCO, event.valueInt2, AudioManager.FLAG_SHOW_UI);
mVgsFromStack = true;
Log.d(TAG, "EventVolumeChange STREAM_BLUETOOTH_SCO value: " + event.valueInt2);
}
Run Code Online (Sandbox Code Playgroud)
当我更改手机上的音量时,我确实看到日志显示声音的更新值,这意味着setStreamVolume()正在调用该方法,但音量不会改变.
有谁知道可能导致这个问题的原因是什么?
编辑:
我仍然在寻找答案,现在正在寻找音频HAL实现.我怀疑HAL和音频驱动程序之间的链接在某种程度上是不正确的...我不太了解低级别的实现,我不确定我应该寻找什么.
现在我可以通过这种方式成功配对并将手机连接到我的机器,而无需任何用户交互:
$bluetoothctl
#power on
#discoverable on
#pairable on
#agent NoInputNoOutput
#default-agent
Run Code Online (Sandbox Code Playgroud)
我从我的手机中搜索 BT 设备,它会自动配对和连接。现在我有两个问题:
它仍然要求授权服务:
授权服务
[代理] 授权服务 0000110e-0000-1000-8000-00805f9b34fb(是/否):
但这不好,因为我已经指定了NoInputNoOutput!
trust但出于同样的原因,我需要自动执行此操作。一般来说,是否有任何可靠的 C++ 库来处理蓝牙连接和 A2DP 和 HFP 等常见配置文件?
我正在尝试向我的 android 应用程序添加对蓝牙设备(如耳机/耳机/汽车音响)的支持,该应用程序允许用户进行 SIP/VoIP 呼叫。我试图主要解决使用蓝牙耳机上的按钮接听和结束通话的要求,其他按钮/功能处理是很好的。
通过我所做的搜索以及到目前为止我阅读的所有文本,我遇到了以下内容-
ACTION_AUDIO_STATE_CHANGED. 但这并没有真正帮助我。每次按下蓝牙耳机上的按钮时都会发送它的意图,并且当我们在蓝牙耳机上开始铃声时也会发送。如果有人做过这样的事情,我认为我面临的问题并不少见,我只是相信它没有很好的记录。任何指针、方法、链接将不胜感激。
当我发现我尝试的任何或任何其他方法时,我将尝试添加更多信息。如果您需要有关我尝试过的解决方案的更多信息,请询问详细信息。并请提出更改建议,而不仅仅是标记问题。感谢广告。
我已经通过 HFP 配置文件在蓝牙耳机和 Android 手机之间建立了连接。
现在我想向 HeadSet 设备发送 AT 命令。
我在 HFP 连接时使用了以下组件。
蓝牙耳机.aidl
ACL 的广播接收器
我没有使用任何createRfcommSocketToServiceRecord套接字连接。
以下功能有什么作用?
boolean sendVendorSpecificResultCode(in BluetoothDevice device,
in String command,
in String arg);
Run Code Online (Sandbox Code Playgroud) 我试图通过Android中的HFP(免提配置文件)控制具有振动功能的蓝牙手链。我已经能够连接到手镯并访问输入和输出流。
我的目标是模拟来电,以便蓝牙手镯开始振动(这似乎是唯一的方法)。为此,即时通讯使用AT命令。在第22页的https://www.bluetooth.org/docman/handlers/downloaddoc.ashx?doc_id=238193的蓝牙规范中,您可以看到建立服务级别连接的握手。我需要建立此连接才能使用“ + CIEV”命令(请参见握手第48页)。
但是当我的手镯返回命令“ AT + CIND =?”时 我不知道该如何回应。我找不到有关如何使用“ CIND:”命令回答的任何提示。我也不知道如何发送确认(只是“ OK”?)。
这甚至可能是完全错误的方法。每个建议都表示赞赏。我只找到一个职位上的计算器,帮助我在某些方面,我找到了帖子的其余悬而未决。顺便说一句,即时通讯使用的智能手机与Android 4.1.2。手链支持HFP和HSP。提前致谢。
更新10/29/2014

=====此时通过RFCOMM套接字建立的连接=====
// read AT+BRSF=0 from device
byte[] buffer = new byte[200];
mBluetoothSocket.getInputStream().read(buffer);
Log.d(TAG, new String(buffer).trim());
//write answer BRSF: ...
mBluetoothSocket.getOutputStream().write("+BRSF=20\r".getBytes());
mBluetoothSocket.getOutputStream().write("OK\r".getBytes());
// read AT+CIND=? command
buffer = new byte[200];
mBluetoothSocket.getInputStream().read(buffer);
Log.d(TAG, new String(buffer).trim());
//write answer CIND: ...
mBluetoothSocket.getOutputStream().write("+CIND: (\"battchg\",(0-5)),(\"signal\",(0-5)),
(\"service\",(0,1)),(\"call\",(0,1)),(\"callsetup\",(0-3)),
(\"callheld\",(0-2)),(\"roam\",(0,1))".getBytes());
mBluetoothSocket.getOutputStream().write("OK".getBytes());
// read AT+CIND?
buffer = new byte[200];
mBluetoothSocket.getInputStream().read(buffer);
Log.d(TAG, new String(buffer).trim());
Run Code Online (Sandbox Code Playgroud)
按照协议的程序,我应该收到“ AT + CIND?” 命令,然后我可以发送命令“ + CIND:5,5,1,0,0,0,0”,但是...我没有收到“ AT …
有人可以帮助了解 HFP 1.6 和 HFP 1.5 之间的区别吗?任何链接或可用的文件?
因为我们可以连接两个具有不同连接类型的蓝牙设备电话音频和音乐音频(即分别为HFP配置文件和A2DP配置文件)。两个设备同时连接,但是HPF优先于A2DP,这意味着当我有活动的SCO连接(或语音呼叫)时,A2DP停止工作。我希望他们两个同时工作。我想从HFP设备获取音频并在A2DP设备上播放。即使可能需要编写NDK代码,也想知道一些解决方法。
我正在开发一个可以通过 HFP 设备播放音乐的项目。但这里有一个问题,我想在播放音乐时检测是否连接了HFP或A2DP。
现在我使用 AVFoundation 框架来做到这一点。这是代码:
- (BOOL)isConnectedToBluetoothPeripheral
{
BOOL isMatch = NO;
NSString* categoryString = [AVAudioSession sharedInstance].category;
AVAudioSessionCategoryOptions categoryOptions = [AVAudioSession sharedInstance].categoryOptions;
if ((![categoryString isEqualToString:AVAudioSessionCategoryPlayAndRecord] &&
![categoryString isEqualToString:AVAudioSessionCategoryRecord]) ||
categoryOptions != AVAudioSessionCategoryOptionAllowBluetooth)
{
NSError * error = nil;
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord
withOptions:AVAudioSessionCategoryOptionAllowBluetooth
error:&error];
if (error) {
[[AVAudioSession sharedInstance] setCategory:categoryString
withOptions:categoryOptions
error:&error];
return isMatch;
}
}
NSArray * availableInputs = [AVAudioSession sharedInstance].availableInputs;
for (AVAudioSessionPortDescription *desc in availableInputs)
{
if ([[desc portType] isEqualToString:AVAudioSessionPortBluetoothA2DP] || [[desc portType] isEqualToString:AVAudioSessionPortBluetoothHFP])
{
isMatch = YES; …Run Code Online (Sandbox Code Playgroud)