寫在前面的話:近距離感應的測試需要真機測試,模擬器是無法打開近距離感應開關的虏辫,近距離感應的主要作用是在用戶貼近耳朵或離開的同時切換話筒和聽筒這兩種模式的這樣一個作用锡溯,使聲音的播放更加貼近用戶習慣。
一踪栋、首先在 .h 里引入頭文件
#import<AVFoundation/AVFoundation.h>
@interfaceViewController :UIViewController<AVAudioPlayerDelegate>
{
AVAudioPlayer*avAudioPlayer;//播放器player
}
二、在.m里進行音頻播放和打開近距離感應開關
//要確定近距離傳感器是否可用图毕,可以嘗試啟用它夷都,即proximityMonitoringEnabled=YES,如果設置的屬性值仍然為NO予颤,說明傳感器不可用囤官。
//路徑下讀取音頻文件
NSString*string =[[NSBundlemainBundle]pathForResource:@"你所使用的歌曲名"ofType:@"音頻格式"];
NSLog(@"%@",string);
//把音頻文件轉化成URL格式
NSURL*url =[NSURLfileURLWithPath:string];
//初始化音頻類并且添加播放文件
avAudioPlayer=[[AVAudioPlayeralloc]initWithContentsOfURL:urlerror:nil];
//設置代理
avAudioPlayer.delegate=self;
//設置初始音量大小
avAudioPlayer.volume=0.5;
//設置音樂播放次數(shù)-1為一直循環(huán)
avAudioPlayer.numberOfLoops=-1;
[avAudioPlayerplay];
//必須設置成這樣才能確保話筒模式成功
//初始化播放器的時候如下設置
UInt32sessionCategory =kAudioSessionCategory_MediaPlayback;
AudioSessionSetProperty(kAudioSessionProperty_AudioCategory,sizeof(sessionCategory),&sessionCategory);
//audioRouteOverride覆蓋音頻線路
UInt32audioRouteOverride =kAudioSessionOverrideAudioRoute_Speaker;
AudioSessionSetProperty(kAudioSessionProperty_OverrideAudioRoute,sizeof(audioRouteOverride),&audioRouteOverride);
AVAudioSession*audioSession = [AVAudioSessionsharedInstance];
//默認情況下?lián)P聲器播放
[audioSessionsetCategory:AVAudioSessionCategoryPlaybackerror:nil];
[audioSessionsetActive:YESerror:nil];
//開啟距離感應器
[UIDevicecurrentDevice].proximityMonitoringEnabled=YES;
//添加監(jiān)聽
[[NSNotificationCenterdefaultCenter]addObserver:selfselector:@selector(proximityStateChange:)name:@"UIDeviceProximityStateDidChangeNotification"object:nil];
-(void)proximityStateChange:(NSNotificationCenter*)notification
{
//傳感器已啟動前提條件下,如果用戶接近近距離傳感器蛤虐,此時屬性值為YES党饮,并且屏幕已關閉(非休眠)
if([[UIDevicecurrentDevice]proximityState]==YES) {
NSLog(@"Device is close to user");
//切換為聽筒播放
[[AVAudioSessionsharedInstance]setCategory:AVAudioSessionCategoryPlayAndRecorderror:nil];
}else
{
//切換為揚聲器播放
[[AVAudioSessionsharedInstance]setCategory:AVAudioSessionCategoryPlaybackerror:nil];
NSLog(@"Decice is not close to user");
//[avAudioPlayer play];
}
}