Ios Can';不要在iPad上控制扬声器
我采用了一种关注我的说话人状态的方法: AudioSession.hIos Can';不要在iPad上控制扬声器,ios,ipad,avaudiosession,Ios,Ipad,Avaudiosession,我采用了一种关注我的说话人状态的方法: AudioSession.h enum { kAudioSessionOverrideAudioRoute_None = 0, kAudioSessionOverrideAudioRoute_Speaker = 'spkr' }; MyClass @synthesize speakerEnabled; ... - (void)setSpeakerEnabled:(BOOL)enable { speakerEnabled = en
enum {
kAudioSessionOverrideAudioRoute_None = 0,
kAudioSessionOverrideAudioRoute_Speaker = 'spkr'
};
MyClass
@synthesize speakerEnabled;
...
- (void)setSpeakerEnabled:(BOOL)enable {
speakerEnabled = enable;
if(enable) {
UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;
AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute
, sizeof (audioRouteOverride)
, &audioRouteOverride);
} else {
UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_None;
AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute
, sizeof (audioRouteOverride)
, &audioRouteOverride);
}
}
然而,它只在iPhone上起作用,而在iPad上则不起作用
- 当我按下on按钮时:
,我进入扬声器打开
和if(enable)
接收AudioSessionSetProperty
kAudioSessionOverrideAudioRoute_扬声器
- 当我按下on按钮时:
,我进入扬声器关闭
和其他
接收音频会话设置属性
kAudioSessionOverrideAudioRoute_None
AVAudioSession
category中添加了:
NSError *err = nil;
BOOL success = [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:&err];
if(!success){
[MyLogger logc:MyLoggerLog format:"%@",[err localizedDescription]];
}
success=YES
仍然不起作用。播放前是否尝试设置音频类别? 我记得不久前我也遇到了同样的问题,并找到了这个解决方案(调整类别) 我在文档中没有找到任何东西,我认为在iPad上你必须设置类别,因为iPhone和iPad在一个细节上有所不同:在iPhone上,左边的硬件开关可以使扬声器静音。在iPad上,同样的开关用于锁定旋转 试着让我知道 编辑: 有用链接:
我认为您误解了该物业的用途。您希望启用/禁用扬声器。这不是
kAudioSessionProperty\u OverrideAudioRoute
的意图。相反,它以相当有限的方式影响输出声音路由
这些是iPhone可用的各种可能的输出路径
extern const CFStringRef kAudioSessionOutputRoute_LineOut
extern const CFStringRef kAudioSessionOutputRoute_Headphones
extern const CFStringRef kAudioSessionOutputRoute_BluetoothHFP
extern const CFStringRef kAudioSessionOutputRoute_BluetoothA2DP
extern const CFStringRef kAudioSessionOutputRoute_BuiltInReceiver
extern const CFStringRef kAudioSessionOutputRoute_BuiltInSpeaker
extern const CFStringRef kAudioSessionOutputRoute_USBAudio
extern const CFStringRef kAudioSessionOutputRoute_HDMI
extern const CFStringRef kAudioSessionOutputRoute_AirPlay
这些是唯一可能的路由-实际可用的路由取决于上下文。苹果严格限制了您在应用程序中确定这些路由的能力,因为用户需要以设备一致的方式控制这些路由。其中大多数都是由用户插拔硬件(耳机、USB、HDMI、线路输出)间接决定的,苹果不希望你的应用程序在这里打乱用户的期望
如果媒体上下文正确(且Airplay可用),则可以使用MPVolumeView
的routeButton
选择Airplay。蓝牙可以通过覆盖类别EnableBluetoothInput
()
特别要注意的是,kAudioSessionOutputRoute\u BuiltInReceiver
是iPhone上的低音扬声器,在打电话时,您可以将它放在耳朵上。如果未插入外部设备(如耳机),这是iPhone的默认音频输出路径kAudioSessionOutputRoute_内置扬声器
是位于手机底部的“免提”扬声器,声音更大
通过设置以下覆盖属性之一,您可以从当前默认值重新路由到此内置扬声器
:
key: kAudioSessionProperty_OverrideAudioRoute
values: kAudioSessionOverrideAudioRoute_Speaker
: kAudioSessionOverrideAudioRoute_None
指定是否覆盖音频会话类别的正常音频路由
指定在未连接其他音频路由(如耳机)时,是否将音频路由到扬声器(而不是接收器)
这两种功能仅设计用于kAudioSessionCategory\u play和record
音频会话类别
请注意,在这两种情况下,您都没有在任何输出路径中进行选择,您只是覆盖了“默认路径”,以支持内置(扬声器)扬声器
iPad没有手机,没有内置扬声器类型。在没有连接的小工具或airplay的情况下,它的默认路径是相同的BuiltInSpeaker
。因此,重写没有任何效果
假设你真的试图在你的应用程序中静音,你如何做到这一点取决于你的应用程序设计的许多其他方面。如果你想让设备静音,苹果宁愿用户通过铃声/静音开关来控制。看来他们不会有别的办法:
我收到了苹果公司的回复。
他们说他们没有也从来没有提供过检测硬件静音开关的方法,也不打算这样做
“扬声器设置是设备的外部设置,而不是给定的声音”AudioSessionSetProperty
有一个返回值,您检查了吗?是的,只返回OSStatus=0
setCategory调用的返回值是什么?如果为否,则相对错误setCategory
返回YES
,没有错误“什么都没有发生”。。。您的意思是-扬声器始终处于启用状态?或者…?谢谢你让我头脑清醒。我不是iOS大师:)你的描述很清楚。无论如何,如果这种方法在iPad上不起作用,我可以使用变通方法,至少将扬声器静音,如按一下设置音量0,反之亦然100%。@MaximShoustin,这取决于您的设计-例如,如果使用AVAudioPlayer,您可以将音量
属性设置为0I使用SIP协议并显示来自其他设备的视频/音频(x264编解码器)@MaximShoustin然后你需要提供更多关于你的应用程序设计的细节,比如你正在使用什么库/框架?。在什么用户/应用程序/设备条件下,您希望静音?你真的应该打开一个新问题来做这件事,否则我们会偏离你原来的问题太远(你可以在这里链接到它)。在iPhone上,上面提到的代码片段工作正常:静音开/关。在iPad上,在调试模式下,我运行相同的流,但什么也没发生。现在我不在xCode上,不能给你更多我目前使用的信息
key: kAudioSessionProperty_OverrideAudioRoute
values: kAudioSessionOverrideAudioRoute_Speaker
: kAudioSessionOverrideAudioRoute_None
key: kAudioSessionProperty_OverrideCategoryDefaultToSpeaker
values: TRUE
: FALSE