我似乎无法在SDK中找到如何以编程方式感知iPhone上的静音按钮/开关.当我的应用程序播放背景音乐时,它会正确响应音量按钮,而我没有任何代码可以遵循,但是,当我使用静音开关时,它只是继续播放.
如何测试静音的位置?
(注意:我的程序有自己的静音开关,但我希望物理开关覆盖它.)
谢谢!
我过去使用过这种方法来检测是否启用了静默开关:
- (BOOL)silenced {
#if TARGET_IPHONE_SIMULATOR
// return NO in simulator. Code causes crashes for some reason.
return NO;
#endif
CFStringRef state;
UInt32 propertySize = sizeof(CFStringRef);
AudioSessionInitialize(NULL, NULL, NULL, NULL);
AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &propertySize, &state);
if(CFStringGetLength(state) > 0)
return NO;
else
return YES;
}
Run Code Online (Sandbox Code Playgroud)
这不再适用于iPad或iPhone上的iOS5.这是一个已知的问题?我无法在堆栈溢出或Apple dev论坛上找到任何答案.
希望你能帮忙......
我正在开发一个我想要的应用程序:
在播放音频时尊重铃声/静音开关,和
当铃声/静音开关设置为静音时,显示一个图标,表示声音已静音.
要求1很简单:我使用的AVAudioSessionSoloAmbient是我的应用程序的音频会话类别,因此当响铃/静音开关关闭时,我的音频会话将自动静音.
要求2似乎相当困难,因为我需要某种回调,通知或KVO,这将允许我监控交换机的位置,但Apple明确表示它不愿意提供正式公开的方式来做到这一点.也就是说,如果我能找到一种非侵入性的方式来监控交换机的位置,即使是技术上被禁止的方式(例如内部NSNotification),我也愿意由Apple运行它.
此外,我宁愿不实施我在别处找到的一些民意调查解决方案.有关示例,请参阅"相关问题"部分.
至少在iOS版本4和5中,有一个技巧可以通过观察当前音频会话的路由属性来获取交换机的位置.除了被AVAudioSession班级弃用之外,我还可以确认这个技巧不再是一个选择.当切换振铃/静音开关时,当前路由(包括已弃用的Audio SessionAPI和当前AVAudioSession类的C函数报告)都不会更改.
AVSystemController是一个似乎有很多承诺的内部类.调用确实- (BOOL)toggleActiveCategoryMuted会使sharedAVSystemController我的应用程序的音频静音.此外,共享单例AVSystemController_SystemVolumeDidChangeNotification在通过音量按钮更改系统音量时发布通知.不幸的是,这个通知不是为响应环/静音开关的变化而发布的(尽管这个可疑的来源说它应该).
据我所知,有没有 NSNotification š张贴由任何对象响应于环/无声开关位置的变化.在将自己添加为默认中心中所有通知的观察者后,我得出了这个结论:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleNotification:) name:nil object:nil];
Run Code Online (Sandbox Code Playgroud)
然后切换响铃/静音开关.没有.
该AVSystemController课程有一个很有前途的签名方法:
- (BOOL)getActiveCategoryMuted:(BOOL*)arg1;
Run Code Online (Sandbox Code Playgroud)
但是,这有两个问题:
BOOL指向的值arg1似乎都没有变化.
我怀疑某个对象GSEventRef在更改静音开关时会发送一些其他对象,因为我在事件类型的声明中看到以下内容:
kGSEventRingerOff = 1012,
kGSEventRingerOn = 1013,
Run Code Online (Sandbox Code Playgroud)
但是,我很确定我无法拦截这些消息,即使我可以,这也不仅仅是"一点点"的干扰.
简单地说:Instagram应用程序基本上表现出这种行为.观看视频时,它会考虑铃声/静音开关的设置,但在开关关闭时会显示一个图标.图标消失并在移动开关后立即重新出现,我认为它必须是基于事件的,而不是轮询.
这个问题(更多)更新,询问iOS 7.但是,因为我愿意接受私有API规则的最小侵入性破坏,我认为这是一个与我自己不同的问题.
我知道Apple没有提供检测iOS 5中 iPhone mute/silence开关状态的方法.但是,我尝试了其他地方提到的技术,通过播放音频文件并测量其运行时来检测这一点.然而,即使我的iPhone被静音,音频文件仍然在整个持续时间内播放.我正在使用和计算之前被调用的时间.你知道播放音频文件的技巧吗?如果手机静音,它会提前/立即完成?[AVAudioPlayer play]audioPlayerDidFinishPlaying
有没有办法在iOS 7中检测静音模式?
以下代码不适用于iOS 5或更高版本
-(BOOL)silenced {
#if TARGET_IPHONE_SIMULATOR
// return NO in simulator. Code causes crashes for some reason.
return NO;
#endif
CFStringRef state;
UInt32 propertySize = sizeof(CFStringRef);
AudioSessionInitialize(NULL, NULL, NULL, NULL);
AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &propertySize, &state);
if(CFStringGetLength(state) > 0)
return NO;
else
return YES;
}
Run Code Online (Sandbox Code Playgroud) 我知道这是一个已被问过多次的问题,我已经检查了大部分与SO相关的答案,但我没有找到解决问题的正确答案.
这是问题所在:
当某个事件被触发时,我试图在游戏中播放一个mp3文件(最多只有2秒),我使用AudioPlayer这样做,下面是代码块:
NSError *error;
AVAudioPlayer *audioPlayer = [[[AVAudioPlayer alloc] initWithContentsOfURL:[[NSBundle mainBundle] URLForResource: @"ding" withExtension: @"mp3"] error:&error] autorelease];
if (error) {
NSLog(@"Error creating audio player: %@", [error userInfo]);
}
else {
BOOL success = [audioPlayer play];
// This always is "Play sound succeeded"
NSLog(@"Play sound %@", success ? @"succeeded" : @"failed");
}
Run Code Online (Sandbox Code Playgroud)
当我在iPhone 4s,iTouch 3/4中运行此代码时,声音总是很清晰,但在iPad 1或iPad2中,扬声器没有声音.但是当我插入耳机时,发生了一些奇怪的事情,我的耳机有声音!iPad未处于静音模式且URL正确无误.
我很困惑为什么会这样.
PS:我尝试了以下代码(从HERE获得)输出音频输出端口类型:
CFDictionaryRef asCFType = nil;
UInt32 dataSize = sizeof(asCFType);
AudioSessionGetProperty(kAudioSessionProperty_AudioRouteDescription, &dataSize, &asCFType);
NSDictionary *easyPeasy = (NSDictionary *)asCFType;
NSDictionary *firstOutput = (NSDictionary …Run Code Online (Sandbox Code Playgroud) 我正在创建一个应用程序,我想在其中检测到iphone是否处于静音模式.
我已经想到了下面的链接
使用AVAudioPlayer检测iPhone的响铃/静音/静音开关不起作用?
很多人说这是违反iPhone政策的.但我看到很多应用程序也提供此功能
检查以下应用链接
https://itunes.apple.com/us/app/silentalert/id506092189?mt=8
我也想改变iPhone的静音模式,就像上面的应用程序一样.
有人知道吗?