[英]Detect attached audio devices iOS
我正在試圖弄清楚如何在iphone / ipad / ipod上連接哪個音頻設備。 我知道有關音頻路由呼叫和路由更改回調的所有內容,但這些並沒有告訴我任何關於附加內容的信息。 它們僅報告音頻當前路由的位置。 例如,我需要知道,當音頻通過揚聲器路由時,耳機和/或藍牙是否仍然連接。 或者,例如,如果用戶在使用藍牙時插入耳機然后決定斷開藍牙,我需要知道即使音頻仍然通過耳機路由,藍牙也會斷開連接。
不幸的是,從iOS11開始,似乎沒有API可靠地獲取當前連接的輸出設備列表 - 只要當前路由發生變化,您只能通過AVAudioSession的currentRoute.outputs
看到1個設備(當前路由),即使仍可連接多個設備。
但是,對於輸入,包括具有HFP配置文件的藍牙設備,如果使用正確的音頻會話模式(例如AVAudioSessionModeVoiceChat
或AVAudioSessionModeVideoChat
),可以通過AVAudioSession的availableInputs
可用輸入的列表,並在那里列出那些輸入即使該設備不是活動路由 - 例如,當用戶通過MPVolumeView
從藍牙到揚聲器進行手動覆蓋時,這非常有用,並且由於HFP是雙向IO(具有輸入和輸出),您可以通過查看輸入來判斷輸出HFP藍牙是否仍然可用。
BOOL isBtInputAvailable = NO;
NSArray *inputs = [[AVAudioSession sharedInstance] availableInputs];
for (AVAudioSessionPortDescription* port in inputs) {
if ([port.portType isEqualToString:AVAudioSessionPortBluetoothHFP]) {
isBtInputAvailable = YES;
break;
}
}
對於iOS 5,您應該使用:
CFStringRef newRoute;
size = sizeof(CFStringRef);
XThrowIfError(AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &size, &newRoute), "couldn't get new audio route");
if (newRoute)
{
CFShow(newRoute);
if (CFStringCompare(newRoute, CFSTR("HeadsetInOut"), NULL) == kCFCompareEqualTo) // headset plugged in
{
colorLevels[0] = .3;
colorLevels[5] = .5;
}
else if (CFStringCompare(newRoute, CFSTR("SpeakerAndMicrophone"), NULL) == kCFCompareEqualTo)
}
您可以從AudioSession屬性獲取InputSources和OutputDestinations的列表。 查看這些會話屬性:
kAudioSessionProperty_InputSources
kAudioSessionProperty_OutputDestinations
並查詢每個細節,您可以使用:
kAudioSessionProperty_InputSource
kAudioSessionProperty_OutputDestination
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.