Ios Can';不要在iPad上控制扬声器

Ios 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

我采用了一种关注我的说话人状态的方法:

AudioSession.h

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

我开始调试,但并没有发现和其他设备的区别

我有iPad2 iOS 6.1

我错过什么了吗

请帮帮我

编辑

正如LombaX所说,我在launch application
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