当 AudioSessionActive 为 NO 时,无法通过硬件按钮控制 AVAudioPlayer 的音量

2024-04-09

我正在构建一个路线导航应用程序,可以播放周期性的简短声音片段。无论屏幕是否锁定,声音都应该播放,应该与其他音乐播放混合,并且应该在播放此音频时使其他音乐闪避。

Apple 在 29:20 分钟的“WWDC 2010 session 412 iPhone OS 音频开发第 1 部分”视频中详细讨论了逐步使用案例。该实现效果很好,但有一个问题 - 当应用程序运行时,按硬件音量控件可以调整铃声音量,而不是应用程序音量。如果您想更改应用程序音量,则必须在播放提示时按音量按钮。

Apple 在视频中非常明确地指出,您不应将 AVAudioSession 保持活动状态,但如果 AVAudioSession 处于非活动状态,则音量按钮将无法控制我的应用程序的音量。

这是我用来设置的代码:

UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback;
propertySetError = AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(sessionCategory), &sessionCategory);

UInt32 allowMixing = true;
propertySetError = AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(allowMixing), &allowMixing);

UInt32 shouldDuck = true;
propertySetError = AudioSessionSetProperty(kAudioSessionProperty_OtherMixableAudioShouldDuck, sizeof(shouldDuck), &shouldDuck);

OSStatus activationResult = AudioSessionSetActive(true);

NSError* err = nil;
_player = [[AVAudioPlayer alloc] initWithData:audioData error:&err];
_player.delegate = self;
[_player play];

最后,我将会话活动设置为“否”,正如苹果建议的那样:

OSStatus activationResult = AudioSessionSetActive(false);
NSAssert(activationResult == kAudioSessionNoError, @"Error deactivating audio session");

我是否遗漏了什么,或者我是否必须违背他们在视频中推荐的内容?


就您而言,您不想将音频会话设置为非活动状态。您需要做的是使用两种方法,一种将会话设置为播放声音,另一种将其设置为空闲。第一种方法设置 mix+duck 音频模式,第二种方法使用背景音频友好模式,如环境模式。

像这样的事情:

- (void)setActive {
    UInt32 mix  = 1;
    UInt32 duck = 1;
    NSError* errRet;

    AVAudioSession* session = [AVAudioSession sharedInstance];
    [session setActive:NO error:&errRet];

    [session setCategory:AVAudioSessionCategoryPlayback error:&errRet];
    NSAssert(errRet == nil, @"setCategory!");

    AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(mix), &mix);
    AudioSessionSetProperty(kAudioSessionProperty_OtherMixableAudioShouldDuck, sizeof(duck), &duck);

    [session setActive:YES error:&errRet];
}

- (void)setIdle {
    NSError* errRet;

    AVAudioSession* session = [AVAudioSession sharedInstance];
    [session setActive:NO error:&errRet];

    [session setCategory:AVAudioSessionCategoryAmbient error:&errRet];
    NSAssert(errRet == nil, @"setCategory!");

    [session setActive:YES error:&errRet];
}

然后调用它:

[self setActive];
[self _playAudio:nil];

玩完后清理:

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer*)player
                   successfully:(BOOL)flag {
[self setIdle];

}

为了成为一个好公民,您的应用程序应该在未导航(即执行其主要功能)时将音频会话设置为非活动状态,但是当它正在导航时,保持音频会话处于活动状态并使用模式来执行操作绝对没有问题。与其他应用程序和平共处。您可以使用上面的代码复制 Apple 的导航应用程序功能。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当 AudioSessionActive 为 NO 时,无法通过硬件按钮控制 AVAudioPlayer 的音量 的相关文章

  • 为什么没有收到(UDP 多播)数据包?

    所以 我一直试图弄清楚为什么这不起作用 但我没有任何线索 我已经成功地从 iPhone 发送数据包并在 Mac 上接收它们 根据 tcpdump 我的 mac 正确发送数据包 此外 如果我在模拟器中运行它 它工作得很好 这让我相信这是一个网
  • CGContextSelectFont 等效项

    在 iOS 7 CGContext SelectFont 中已弃用 已弃用的消息说我必须使用 Core Text 但我不知道哪一个与这段代码完全相同 CGContextSelectFont context Helvetica kBarLab
  • 如何将 UIImageView 裁剪为自定义形状

    用户是否可以在该位周围画一条虚线 圆圈 UIImageView他们希望裁剪到 然后为UIImageView调整大小到这些点 这有点像 Photoshop 中的套索 选取框效果 更新 从 iOS 8 x 开始 UIImageView 提供了m
  • 使用 Cocoa/OSX 合并/堆叠两个图像

    我有一个 CGImageRef 我们称之为原始图像 和一个透明 png 水印 我正在尝试编写一种方法将水印放置在原始内容之上 并返回 CGImageRef 在 iOS 中 我会使用 UIKit 将它们绘制到上下文中 但这在 OSX 中似乎不
  • Objective C (iphone) 关于发布的问题

    如果我创建一个视图 并将其添加为子视图并将其添加到数组中 是否必须释放它两次 UIView cat UIView alloc initWithFrame someFrame self view addSubview cat self ani
  • 如果加载 dylib,垃圾收集工作队列会崩溃

    我们正在将应用程序从 10 6 移植到 10 8 我正在查看我们在应用程序中加载的 dylib 我面临着非常不寻常的崩溃垃圾收集工作队列并附有以下消息 malloc Thread suspend unable to suspend a th
  • 如何在应用程序项目中使用 Cocoa Touch 框架

    我熟悉构建单个 iOS 应用程序 但我坚持使用 Cocoa Touch 框架向多个应用程序共享通用代码 问题 框架的头文件不可见 无法链接到消费应用程序项目 我做了什么 1 我创建了一个名为 libTestFramework 的项目 Coc
  • 使用自动布局、IB 和字体大小时表头视图高度错误

    我正在尝试为我的 uiTableView 创建一个标题视图 不是节标题 我已经有了 我已经在界面生成器中设置了一个 XIB 所有的连接都已连接好并且运行良好 除了桌子没有给它足够的空间 我的问题是表格顶部与表格标题有一点重叠 我的 XIB
  • 如何编辑应用程序包中的文件?

    在我的应用程序中 我从存储在捆绑资源中的 CSV 文件加载数据 但是 我希望能够在用户点击 更新 按钮时以编程方式更新此文件 有没有办法以编程方式更改应用程序包中的资源 这是我用来访问该文件的代码 NSString path NSBundl
  • 当 ViewController 从 UIStoryboard 实例化时,isMemberOfClass 返回 no

    我有一个 OCUnit 测试类 PatientTestViewControllerTests 下面是界面 interface PatientTestViewControllerTests SenTestCase property nonat
  • 如何清除代码中的 NSLog 输出?

    有没有办法清除代码中的控制台输出 thanks 我喜欢的快捷方式 Simply USE K Keyboard Shortcut when you want to clear the NSLOG Data
  • 为什么 Objective-C 方法名称的最后一部分必须带有参数(当有多个部分时)?

    在 Objective C 中 您不能声明最后一个组件不带参数的方法名称 例如 以下内容是非法的 void take id theMoney andRun void take id yourMedicine andDontComplain
  • 更改导航项(栏)的背景颜色

    有没有一种简单的方法可以更改视图顶部导航项的背景颜色 我有一个基于导航的应用程序 我只希望一个视图获得另一种背景颜色 我主要使用 IB 创建视图 我找到了以下解决方案 未测试 float r 10 float g 55 float b 13
  • Objective-C 中是否有命名初始化方法的约定?

    在可以通过不同的 init 方法初始化的 Objective C 类中 将所有初始化程序共用的初始化代码收集到一个从其他 init 方法 有时也从从 Nib 唤醒 是否有关于如何命名该方法的约定 初始化器 初始化公共 根据 Apple 的说
  • Objective-C:int值无故改变

    Objective C 我需要帮助保留 int 的值 无需我的命令 它就在我身上发生变化 最初的问题是 如何声明和保留 int 这在另一篇文章中得到了满足 Objective C 如何声明和保留 int https stackoverflo
  • NSCFData fastCharacterContents 崩溃? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我目前在控制台中收到此崩溃日志 20
  • iPhone UINavigationBar 使用 [UINavigationBar 外观] 更改所有控制器的字体样式

    我知道我可以单独更改导航栏的字体 如本答案所述 更改导航栏的字体 https stackoverflow com questions 5832036 change the navigation bars font 目前我正在使用一种更全局的
  • 推入 UINavigationController 时隐藏 FBFriendPickerViewController 导航栏

    介绍一个实例FBFriendPickerViewController using presentViewController animated completion 非常简单 该类似乎是针对该用例的 但是 我想推送一个实例FBFriendP
  • 关于窗口层次结构的警告

    我的调试器中出现这样的警告 这是什么意思 Warning Attempt to present
  • 防止 AlertView 被解雇

    任何人都可以帮助我防止在其按钮单击事件上解雇警报视图吗 我有一个 textview 作为我的alertView 的子视图 如果 textview 值为 nil 我不想关闭它 因为这是一个非常老的问题 但我得到了一个解决方案 并且如果其他开发

随机推荐

  • WCF路由——如何以编程方式正确添加过滤表

    我正在使用 WCF 4 路由服务 并且需要以编程方式配置该服务 而不是通过配置 我见过的这样做的例子很少见 创建一个 MessageFilterTable 如下 var filterTable new MessageFilterTable
  • 如何在 Android 中的列表视图中显示联系人(适用于 Android api 11+)

    如果这看起来像同一个问题一百万次 我很抱歉 但是谷歌搜索没有提供任何结果 只是一堆过时的教程使用managedQuery以及其他已弃用的解决方案 我经历了用于检索联系人列表的 Android 开发人员培训 http developer an
  • 有没有办法将operator.itemgetter与切片表示法一起使用?

    我在 python 列表中有一堆 numpy 数组lst 我可以对这些数组之一进行切片 通过使用以下命令对其进行索引来获取特定视图 1 例如 我需要将此切片操作应用于所有 numpy 数组lst 使用生成器理解 我可以这样做 my arra
  • Terraform - 迭代模板中的对象列表

    我在迭代由 解释的模板内的对象列表时遇到问题templatefile功能 我有以下变量 variable destinations description A list of EML Channel Destinations type li
  • 将参数放入webservlet的url中

    我正在使用 Webservlet 我想在 url 本身中传递参数 就像是 WebServlet profile id public class ProfileServlet extends HttpServlet Override publ
  • 如何重新加载当前的路线守卫?

    假设我有一条有守卫的路线AdminGuard 只有当我是管理员时才允许我进入 但是当我在那个页面上点击Logout状态通过 Observables 传播到所有应用程序中 但我仍然处于一条我不应该处于的路线中 因为我已经注销了 如何 重新激活
  • PHP 对齐数组键值

    我在 Google 上搜索了两天 并尝试查看 PHP 手册 但我仍然不记得那个对齐 PHP 数组键值的函数 我正在寻找的只是需要这个的函数 Array 0 gt 1 3 gt 2 4 gt 3 7 gt 4 9 gt 5 并将其转换成这样
  • 查找早于 FILE 的文件而不包含 FILE

    我有一个计划要使用find给我一个比某些 FILE 更旧的文件列表 然后使用xargs or exec 将文件移动到其他地方 搬东西不是问题 xargs mv trash工作正常 现在 如果我尝试使用 newer FILE then FIL
  • Django 注销问题

    这是我在 Django 身份验证中遇到的问题 访问需要登录的页面 注销 访问 django contrib auth logout 访问原始登录保护页面 您仍处于登录状态 有什么想法如何解决这个问题吗 我的 Django 会话设置是 SES
  • Gradle 自定义插件:添加扩展对象的依赖项

    我正在尝试编写一个插件来添加依赖项project dependencies根据插件扩展对象中收集的信息 但这似乎是不可能的 事实上 来自扩展对象的数据仅在新任务或project afterEvaluate关闭 但在这些地方添加的依赖项将被忽
  • 如何更改图像中的像素

    我实际上尝试执行以下操作 我已在 bitmapdata 对象中加载了外部图像 并从中创建了一个位图 我将其附加到 sprite MovieClip 以便在其上包含鼠标事件 现在 根据前面的逻辑 我加载了两个相同大小的图像 比方说圆圈 其中一
  • 区分 gcc 诊断

    我在解释 gcc 4 8 2 警告和错误时遇到问题 更准确地说 很难判断一个问题从哪里结束 另一个问题从哪里开始 我只能通过控制台访问构建机器 因此不能选择使用 IDE 我真的需要能够快速区分各个问题 有没有办法让 GCC 在不同的诊断消息
  • 如何在 Visual Studio Code 的 Zen 模式下显示选项卡?

    In Visual Studio Code how to you keep tabs the tabs from hiding when you enter Zen mode Ctrl K Z 我自己回答这个问题 因为我不得不这样做几次 而
  • Java常量示例(创建仅包含常量的java文件)

    声明只有常量的 java 文件的最佳实践是什么 public interface DeclareConstants String constant Test OR public abstract class DeclareConstants
  • PHP中虚函数的正确实现?

    在我的工作场所 仅限 php 我们有一个数据库抽象的基类 当您想要将新的数据库表添加到基础层时 您必须创建该基类的子类并重写一些方法来定义使用该表的单独行为 正常行为应该保持不变 现在我在我们公司见过很多新程序员 他们只是重写默认行为的方法
  • 通过指针创建字符串

    我了解到指针指向内存地址 因此我可以使用它来更改该地址处设置的值 像这样 int pPointer iTuna pPointer这里有内存地址iTuna 所以我们可以使用pPointer改变值iTuna 如果我打印pPointer内存地址被
  • SQL Server 时区更改

    我在同一个 SQL Server 上有 2 个数据库 是否有可能一个在太平洋标准时间 另一个在东部标准时间 不 日期 时间源自运行 SQL Server 实例的计算机的操作系统 不过 您可以拥有一个自定义 UDF 您可以调用该 UDF 而不
  • 将准备好的语句与 JDBCTemplate 结合使用

    我正在使用 JDBC 模板 并希望使用准备好的语句从数据库中读取数据 我迭代 csv 文件中的多行 并在每一行上使用相应的值执行一些 SQL 选择查询 我想加快从数据库的读取速度 但我不知道如何让 JDBC 模板与准备好的语句一起使用 有的
  • 带有闪亮下载数据按钮的自定义 html

    我想知道如何使闪亮downloadHandler使用自定义 html UI In my index html我有以下内容 a class shiny download link shiny bound output export a 并且在
  • 当 AudioSessionActive 为 NO 时,无法通过硬件按钮控制 AVAudioPlayer 的音量

    我正在构建一个路线导航应用程序 可以播放周期性的简短声音片段 无论屏幕是否锁定 声音都应该播放 应该与其他音乐播放混合 并且应该在播放此音频时使其他音乐闪避 Apple 在 29 20 分钟的 WWDC 2010 session 412 i