监听耳机插孔事件

news/2024/11/24 9:32:02/

苹果设备的耳机插孔除了可以插入耳塞听音乐之外,还可以插入其他的的三方设备,比如刷卡器的拉卡拉app应用等。

这有一个简单的demo,用来监听耳机插孔插入,拔出,以及播放歌曲是的控制。

不过app和设备之间的通讯还没有解决,哪位大神解决了求分享!微笑


1.AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    NSError *error = nil;
    AVAudioSession *audionSession = [AVAudioSession sharedInstance];
    [audionSession setCategory:AVAudioSessionCategoryPlayback error:&error];
    [audionSession setActive:YES error:&error];


    [[AVAudioSession sharedInstance]setCategory:AVAudioSessionCategoryPlayback error:nil];
    AudioSessionAddPropertyListener (kAudioSessionProperty_AudioRouteChange,
                                     audioRouteChangeListenerCallback,
                                     (__bridge void *)(self));


    [[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; // 这一句很重要
    return YES;
}


//触发的监听事件
void audioRouteChangeListenerCallback (void *inUserData, AudioSessionPropertyID inPropertyID, UInt32 inPropertyValueSize,const void *inPropertyValue ) {
    
    NSString *msg=@"耳机插孔已拔出";
//    if (inPropertyID != kAudioSessionProperty_AudioRouteChange)return;
//    else{
        CFDictionaryRef routeChangeDictionary = (CFDictionaryRef)inPropertyValue;
        CFNumberRef routeChangeReasonRef = (CFNumberRef)CFDictionaryGetValue (routeChangeDictionary, CFSTR (kAudioSession_AudioRouteChangeKey_Reason));
        
        SInt32 routeChangeReason;
        CFNumberGetValue (routeChangeReasonRef, kCFNumberSInt32Type, &routeChangeReason);
        if (routeChangeReason == kAudioSessionRouteChangeReason_OldDeviceUnavailable) {
            
            msg=@"耳机插孔已拔出";
        } else if (routeChangeReason == kAudioSessionRouteChangeReason_NewDeviceAvailable) {
            msg=@"耳机插孔已插入";
        }
//    UIAlertView *alert=[[UIAlertView alloc]initWithTitle:@""
//                                                 message:msg
//                                                delegate:nil
//                                       cancelButtonTitle:@"确定"
//                                       otherButtonTitles:nil, nil];
//    [alert show];
    
    NSLog(@"msg :%@",msg);
    
//    }
}



2.UIViewController

- (void)_playBt:(UIButton *)sender {
    
    NSLog(@"playVoice");
    NSString *path=[NSString stringWithFormat:@"%@/%@",[[NSBundle mainBundle] bundlePath],
                    @"ring.mp3"];
    if (!player) {
        NSURL *url = [[NSURL alloc] initFileURLWithPath:path];
        player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
    }
    player.numberOfLoops=-1;
    [player setVolume:0];
    [player play]; //播放
}

- (void)viewDidLoad {
   [self _playBt:nil];
}



// 监听耳机插孔事件

- (void) remoteControlReceivedWithEvent: (UIEvent *) receivedEvent {
    
    if (receivedEvent.type == UIEventTypeRemoteControl) {
        switch (receivedEvent.subtype) {
            case UIEventSubtypeRemoteControlTogglePlayPause:// 103
                break;
            case UIEventSubtypeRemoteControlPreviousTrack:
                break;
            case UIEventSubtypeRemoteControlNextTrack:// 104
                break;
            default:
                break;
        }
    }
}



http://www.ppmy.cn/news/345062.html

相关文章

Android 耳机状态监听

项目中遇到这样的需求,要求监听耳机插拔状态变化,进行埋点上报处理,把实现代码分享一下。 public class MainActivity extends AppCompatActivity {private static final String TAG MainActivity.class.getSimpleName();private boolean is…

监听器的使用

监听器的使用 Java的事件监听机制 1、事件监听涉及到三个组件:事件源、事件参数对象、事件监听器 2、当事件源上发生某一个动作时,它会调用事件监听器的一个方法,并在调用该方法时把事件参数对象传递进去, 开发人员在监听器中通…

Spring Cloud常用组件介绍(Netflix、Alibaba)

Spring Cloud常用组件介绍 文章目录 **Spring Cloud常用组件介绍**一、说明**1.1.什么是Spring Cloud**1.2.Spring Cloud的组件选型 **二、组件介绍****2.1.服务注册与发现****2.1.1.Netflix Eureka****1)分布式模型****2)主要组件****3)工作…

监听器的介绍

监听器:作用域事件发生的时间往往是不确定的,当事件发生的时候需要进行一些处理时,就可以使用监听器,例如监听一个事件的创建,销毁。 监听器的API事件类和接口6种事件 1.上下文事件: ServletContextEven…

什么是监听器?

前言:重新回忆一下,过滤器,拦截器,监听器! 这三者在实际开发中所起到的作用非同小可.实际开发中必须会的知识点. 千里之行,积于跬步 此图是帮助我们更好整理. WEB监听器 1,什么是监听器? web监听器是一种Servlet中的特殊的类,它能帮助开发者监听web中特定的对象,例如Serv…

watch监听

1.概念 1、在vue中watch用来监听数据的变化,当数据变化时可以执行一些操作 2、第一次绑定watch时,不会执行监听函数,发生改变时才会触发监听。 3、如果想要第一次绑定watch时触发监听,则使用handler方法:如果immed…

监听器

在Android中,我们可以通过事件处理使UI与用户互动(UI Events)。 UI的用户事件处理,即View处理用户的操作,在应用程序中几乎不可避免。View是重要的类,它是与用户互动的前线;在Android框架的设计中,以事件监…

监听监听~

java 监听 抛砖引玉 ,汲取百家之长~ - java的监听 分2种吧 自己总结 1.界面化编程使用(一般C/s架构) 2.网页web编程使用(一般B/s架构) 首先, 进行过Java图形界面编程的同学会发现,各种控…