插入/拔出耳机时如何获得通知?苹果

Posted

技术标签:

【中文标题】插入/拔出耳机时如何获得通知?苹果【英文标题】:How to get notifications when the headphones are plugged in/out? Mac 【发布时间】:2013-01-07 03:08:51 【问题描述】:

我希望在耳机插入或拔出耳机插孔时收到通知。 我已经在 *** 上搜索了这个,但我似乎无法找到我正在寻找的 Mac,我只能找到 ios。 那么,您对如何执行此操作有任何想法吗?我想要做的是:当耳机被拔出时,我想以编程方式暂停 iTunes(类似 iOS 的功能)。 谢谢!

【问题讨论】:

我也看到了这个问题。它适用于 iOS,而不适用于 OSX 我的错...当我第一次阅读时,我没有注意到他们提到的 iOS。 您是在寻找真正的耳机(已插入)还是只想知道“某物”何时插入(内部扬声器 = 关闭)。 @DigiMonk 这个问题就是 mori57 所说的(他已经删除了评论)。如果您仔细观察,那是针对 iOS 而不是 OSX。但是,我想要执行的是:当耳机被拔出时,我以编程方式停止 iTunes。 @adib ***.com/questions/5893244/… 貌似是针对mac的,其实答案是针对iOS的 【参考方案1】:

我正在寻找类似的解决方案,并在应用商店中找到了AutoMute。效果很好。

我也在编写自己的一些脚本,并写了this script 来测试是否插入了耳机:

#!/bin/bash
if system_profiler SPAudioDataType | grep --quiet Headphones; then
  echo plugged in
else
  echo not plugged in
fi

【讨论】:

【参考方案2】:

您可以使用CoreAudio 框架观察变化。

耳机和扬声器都是同一音频输出设备(内置类型)上的数据源。根据是否插入耳机,两者之一将在音频设备上。

要获得通知,您可以在内置输出设备上监听活动数据源的变化。

1。获取内置输出设备

为了简短起见,我们将使用默认输出设备。在大多数情况下,这是内置输出设备。在现实生活中的应用程序中,您需要循环所有可用设备来找到它,因为默认设备可以设置为不同的音频设备(例如 soundflower 或 airplay)。

AudioDeviceID defaultDevice = 0;
UInt32 defaultSize = sizeof(AudioDeviceID);

const AudioObjectPropertyAddress defaultAddr = 
    kAudioHardwarePropertyDefaultOutputDevice,
    kAudioObjectPropertyScopeGlobal,
    kAudioObjectPropertyElementMaster
;

AudioObjectGetPropertyData(kAudioObjectSystemObject, &defaultAddr, 0, NULL, &defaultSize, &defaultDevice); 

2。读取其当前数据源

设备上的当前数据源由 UInt32 类型的 ID 标识。

AudioObjectPropertyAddress sourceAddr;
sourceAddr.mSelector = kAudioDevicePropertyDataSource;
sourceAddr.mScope = kAudioDevicePropertyScopeOutput;
sourceAddr.mElement = kAudioObjectPropertyElementMaster;

UInt32 dataSourceId = 0;
UInt32 dataSourceIdSize = sizeof(UInt32);
AudioObjectGetPropertyData(defaultDevice, &sourceAddr, 0, NULL, &dataSourceIdSize, &dataSourceId);

3。观察数据源的变化

AudioObjectAddPropertyListenerBlock(_defaultDevice, &sourceAddr, dispatch_get_current_queue(), ^(UInt32 inNumberAddresses, const AudioObjectPropertyAddress *inAddresses) 
    // move to step 2. to read the updated value
);

确定数据源类型

当您的数据源 ID 为 UInt32 时,您可以使用值转换器查询音频对象的属性。例如,要将源名称作为字符串使用kAudioDevicePropertyDataSourceNameForIDCFString。这将产生字符串“内部扬声器”或“耳机”。但是,这可能因用户区域而异。

更简单的方法是直接比较数据源id:

if (dataSourceId == 'ispk') 
    // Recognized as internal speakers
 else if (dataSourceId == 'hdpn') 
    // Recognized as headphones

但是我找不到为这些值定义的任何常量,所以这有点无证。

【讨论】:

天哪,你是救生员!它工作得很好!非常感谢!我只有 2 个问题: 1. 我在 10.8 上对其进行测试,效果很好。它会在 10.7 上正常工作吗? 2. 对应用商店友好吗? 我正在寻找基于网络的解决方案。浏览器可以连接到 CoreAudio 框架吗? 与 iOS API 相比,这感觉非常低级。如果有一个“更 Swifty”的解决方案,那将是最受欢迎的。 @RZKY - 不。 CoreAudio 是一个低级的 iOS 系统框架,无法被运行在 Safari 中的 javascript 访问。我不知道任何可以检测系统音频输出类型的 Web API。 (Mozila 在 FireFox AudioChannels API 中拥有此功能有一段时间,但从未流行起来;请参阅 developer.mozilla.org/en-US/docs/Archive/B2G_OS/API/…)

以上是关于插入/拔出耳机时如何获得通知?苹果的主要内容,如果未能解决你的问题,请参考以下文章

如何在 UWP 应用程序中检测拔出的耳机插孔?

OSX 如何判断用户何时插入/拔出带有内置麦克风的耳机

插入/拔出耳机时 SKAudioNode() 崩溃

检测耳机插入和拔出

通过AppWidgetProvider判断耳机是不是插入,拔出时暂停音乐

插入或拔出耳机时 iOS 应用程序崩溃