文档章节

【必看】AVAudioPlayer播放声音时加入了后台播放功能,看懂了吗?

妇女队长
 妇女队长
发布于 2014/05/06 15:13
字数 289
阅读 56
收藏 0
点赞 0
评论 0

-(void)setAudioPlayer{

        //加入播放按钮        

        if (playButton==nil) {

                playButton = [UIButton buttonWithType:UIButtonTypeCustom];

                playButton.frame = CGRectMake(110, 120, 80, 80);

                [playButton setBackgroundImage:[UIImage imageNamed:@"play.png"] forState:UIControlStateNormal];

                playButton.alpha = 0.5;

                [firstPage addSubview:playButton];

        }

        

        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];

        if (soundPath!=nil) {

                float volumn = [bookSetting getUpdatedVolumn];

                player = [[SoundPlayer alloc]initWithPath:soundPath bookName:bookName volumn:volumn];

        }

        [pool release];

}

-(void)setPlayInBackground{

        if (soundPath!=nil) {

                //后台播放

                [self registerForBackgroundNotifications];

                OSStatus result = AudioSessionInitialize(NULL, NULL, NULL, NULL);

                if (result)

                        NSLog(@"Error initializing audio session! %d", result);

                

                [[AVAudioSession sharedInstance] setDelegate: self];

                NSError *setCategoryError = nil;

                [[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error: &setCategoryError];

                if (setCategoryError)

                        NSLog(@"Error setting category! %d", setCategoryError);

                

                result = AudioSessionAddPropertyListener (kAudioSessionProperty_AudioRouteChange, RouteChangeListener, self);

                if (result) 

                        NSLog(@"Could not add property listener! %d", result);

        }

}

#pragma mark AudioSession handlers


void RouteChangeListener(void * inClientData,

                                                 AudioSessionPropertyID        inID,

                                                 UInt32 inDataSize,

                                                 const void * inData){

        BookContentView2* This = (BookContentView2*)inClientData;

        

        if (inID == kAudioSessionProperty_AudioRouteChange) {

                

                CFDictionaryRef routeDict = (CFDictionaryRef)inData;

                NSNumber* reasonValue = (NSNumber*)CFDictionaryGetValue(routeDict, CFSTR(kAudioSession_AudioRouteChangeKey_Reason));

                

                int reason = [reasonValue intValue];

                

                if (reason == kAudioSessionRouteChangeReason_OldDeviceUnavailable) {

                        [This.player stop];

                }

        }

}


- (void)audioPlayerBeginInterruption:(AVAudioPlayer *)p

{

        NSLog(@"Interruption begin. Updating UI for new state");

        // the object has already been paused,        we just need to update UI

        if (inBackground)

        {

                [self updateViewForPlayerStateInBackground:p];

        }

        else

        {

                [self updateViewForPlayerState:p];

        }

}


- (void)audioPlayerEndInterruption:(AVAudioPlayer *)p

{

        NSLog(@"Interruption ended. Resuming playback");

        [self startPlaybackForPlayer:p];

}


#pragma mark background notifications

- (void)registerForBackgroundNotifications

{

        [[NSNotificationCenter defaultCenter] addObserver:self

                                                                                         selector:@selector(setInBackgroundFlag)

                                                                                                 name:UIApplicationWillResignActiveNotification

                                                                                           object:nil];

        

        [[NSNotificationCenter defaultCenter] addObserver:self

                                                                                         selector:@selector(clearInBackgroundFlag)

                                                                                                 name:UIApplicationWillEnterForegroundNotification

                                                                                           object:nil];

}


- (void)setInBackgroundFlag

{

        inBackground = YES;

}


- (void)clearInBackgroundFlag

{

        inBackground = NO;

}

© 著作权归作者所有

共有 人打赏支持
妇女队长
粉丝 0
博文 4
码字总数 2449
作品 0
石景山
AVAudioPlayer 音频播放器 使用 教程

IOS中有三种播放音频的方式:AVAudioPlayer、音频服务、音频队列。 此文主要讲AVAudioPlayer,其他两个请见相关文章。 AVAudioPlayer在AVFoundation框架下,所以我们要导入AVFoundation.fram...

孙启超 ⋅ 2012/06/05 ⋅ 0

iOS开发之多媒体播放

iOS sdk中提供了很多方便的方法来播放多媒体。本文将利用这些SDK做一个demo,来讲述一下如何使用它们来播放音频文件。 AudioToolbox framework 使用AudioToolbox framework。这个框架可以将比...

晨曦之光 ⋅ 2012/03/09 ⋅ 0

iPhone 应用开发:音频播放

在 iPhone 应用或者是游戏的开发过程中,对声音的支持是必不可少的。在我做过的几个应用中,每个都涉及到音效,所以在这里做个简单的归纳,很多都是引用自《iPhone Application Programming ...

长平狐 ⋅ 2012/08/13 ⋅ 0

ios音频播放

在 iPhone 应用或者是游戏的开发过程中,对声音的支持是必不可少的。在我做过的几个应用中,每个都涉及到音效,所以在这里做个简单的归纳,很多都是引用自《iPhone Application Programming ...

长平狐 ⋅ 2012/10/09 ⋅ 0

AVAudioPlayer音频播放器—IOS开发

IOS中有三种播放音频的方式:AVAudioPlayer、音频服务、音频队列。 此文主要讲AVAudioPlayer,其他两个请见相关文章。 AVAudioPlayer在AVFoundation框架下,所以我们要导入AVFoundation.fram...

junwong ⋅ 2012/03/05 ⋅ 1

iPhone 应用开发:音频播放

在 iPhone 应用或者是游戏的开发过程中,对声音的支持是必不可少的。在我做过的几个应用中,每个都涉及到音效,所以在这里做个简单的归纳,很多都是引用自《iPhone Application Programming ...

长平狐 ⋅ 2012/08/13 ⋅ 0

iOS 多媒体

一、音频 在iOS开发中,主要使⽤用四种⽅式来播放音频: System Sound Services (系统声音服务) AVAudioPlayer (高级音频播放器) : 只能播放一个完整的音频, 完全下载好的 AVPlayer(负责视频操...

从訫开始_倾深爱 ⋅ 2016/09/14 ⋅ 0

使用System Sound Services后台播放声音

最近在做运动相关的应用,需要在应用退到后台的时候播放声音,比如你已经跑了多少公里了,GPS信号不好,目标已达成等。 刚开始使用了 AVAudioPlayer,实现了后台播放的功能,但发现一个比较致...

RDeveloper ⋅ 2016/07/29 ⋅ 0

iPhone 播放音频声音文件

播放音频声音文件 iphone开发中播放声音文件主要使用AVAudioPlayer 类,它的功能非常强大支持播放音频的格式也非常的多,我们可以把它看成一个高级的音乐播放器,它支持的播放格式有 ■ AAC ...

彭博 ⋅ 2012/03/09 ⋅ 0

AVFoundation开发秘籍笔记-02播放和录制音频

一、音频会话 AVAudioSession 音频会话在应用程序和操作系统之间扮演着中间人的角色,提供一种简单实用的方法是OS得知应用程序应该如何与iOS音频环境进行交互。 有框架引入。每个iOS应用程序...

竹与豆 ⋅ 05/25 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

idea 整合 vue 启动

刚学习Vue 搭建了一个项目 只能命令启动 Idea里面不会启动 尝试了一下修改启动的配置 如下: 1.首先你要保证你的package.json没有修改过 具体原因没有看 因为我改了这个name的值 就没办法启动...

事儿爹 ⋅ 10分钟前 ⋅ 0

数据仓库技术概述(一看就是架构师写的,对我极其有用)

ETL,是英文 Extract-Transform-Load 的缩写,用来描述将数据从来源端经过抽取(extract)、交互转换(transform)、加载(load)至目的端的过程。ETL一词较常用在数据仓库,但其对象并不限于...

gulf ⋅ 12分钟前 ⋅ 0

redis在windows环境的后台运行方法

在后台运行,首先需要安装redis服务,命令为 redis-server.exe --service-install redis.windows.conf --loglevel verbose 启动,命令为 redis-server --service-start 停止,命令为 redis-...

程序羊 ⋅ 13分钟前 ⋅ 0

比特币现金开发者提出新的交易订单规则

本周,四位比特币现金的四位开发者和研究员:Joannes Vermorel(Lokad),AmaurySéchet(比特币ABC),Shammah Chancellor(比特币ABC)和Tomas van der Wansem(Bitcrust)共同发表了一篇关...

lpy411 ⋅ 17分钟前 ⋅ 0

vue获取input输入框的数据

用惯了jQuery,突然使用vue感觉很不习惯,有很多不同的地方,感觉是两个不同的思想来写前端的代码。jQuery是使用选择器($)选取DOM对象,对其进行赋值、取值、事件绑定等操作。而Vue则是通过...

王子城 ⋅ 19分钟前 ⋅ 0

竟然这就是面向对象的游戏设计?!

从程序角度考虑,许多 JavaScript 都基于循环和大量的 if/else 语句。在本文中,我们可了解一种更聪明的做法 — 在 JavaScript 游戏中使用面向对象来设计。本文将概述原型继承和使用 JavaSc...

柳猫 ⋅ 24分钟前 ⋅ 2

git cmd git bash

刚用到了Git,看到windows环境下有两个命令输入窗口 第一个是可视化图形界面,第二个是CMD,第三个是Bash。 Git中的Bash是基于CMD的,在CMD的基础上增添一些新的命令与功能。所以建议在使用的...

东东笔记 ⋅ 26分钟前 ⋅ 0

分布式系统CAP和Base

1、分布式系统 1.1 简介 由多台计算机和通信的软件组件通过计算机网络连接(本地网络或广域网)组成。分布式系统是建立在网络之上的软件系统。正是因为软件的特性,所以分布式系统具有高度的...

xixingzhe ⋅ 37分钟前 ⋅ 0

查看磁盘占用情况

记一次jenkins构建失败的问题 Build step 'Send build artifacts over SSH' changed build result to UNSTABLE 网上查资料都没明确表明是什么错,回忆之前处理这样的问题。第一时间想到的是不...

ManderSF ⋅ 39分钟前 ⋅ 0

数据库管理提速:SQL解析的探索与应用

前言: SQL解析是一项复杂的技术,一般都是由数据库厂商来掌握,当然也有公司专门提供SQL解析的API。SQL解析与优化是属于编译器范畴,和C语言等其他语言的解析没有本质的区别。其中分为词法分...

java高级架构牛人 ⋅ 46分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部