Qt 4.8 - 在 mac-mini (OS X Lion) 上检测 sd 卡的插入和移除

Posted

技术标签:

【中文标题】Qt 4.8 - 在 mac-mini (OS X Lion) 上检测 sd 卡的插入和移除【英文标题】:Qt 4.8 - detect insertion and removal of sd card on mac-mini (OS X Lion) 【发布时间】:2012-12-29 01:01:29 【问题描述】:

我对在 Mac 上开发应用程序完全陌生。在这里,我只使用 Qt 开发了 2-3 个应用程序,没有使用 Objective-c / cocoa / xcode 开发。

有没有办法在 Qt 4(特别是 4.8)中检测 SD 卡何时插入 Mac mini(OS X Lion)?

我在网络和 *** 上(重新)搜索了很多 - 一些结果出现了 - 但都是针对 android 和 Windows - 与 Mac(mini OS X Lion)无关。

到目前为止,我发现了这个:

在 Mac (mini) 上,读卡器的处理方式与任何其他 USB 设备一样 我还在 Mac 开发人员库中找到了这个 example。我希望所有人都可以访问此链接。 此示例...“演示了使用 IOKitLib 和 IOUSBLib 在 USB 设备连接到系统或从系统中移除时设置异步回调”。因此是可以实现的。 我想在 Qt 中做同样的事情。

我想检测 SD 卡何时插入,然后我想显示我的应用程序,获取一些输入并将所选文件从卡移动到本地磁盘。 显然,一切都很容易 - 仅检测卡片并显示应用程序(从托盘或最小化状态)是重要且困难的部分。

如果您能指出正确的方向,我将不胜感激。 提前致谢!!


更新:

我进一步研究发现:

在 Linux 上,我们可以使用 udev(libudev) 来实现这样的目标。 但后来我发现udev is Linux specific and won't find that in OS X。答案here 建议use the diskutil activity command to continuously monitor disks being mounted or ejected。我发现here 和here 非常相似,但对于Linux 使用udev em> 规则:( 最新且看似最相关的发现是: diskutil plistIOKit(DiskArbitration) 必须成为我寻求的解决方案的一部分 最后here我发现了launchdplistLingon

现在...我有比昨天更多的东西,但我仍然需要帮助将所有这些放在一起并在 Qt 应用程序中使用它。我非常感谢有人指导我达到最终结果。如果我真的能创造出有用的东西,我会继续努力并更新。

提前致谢!! :)

【问题讨论】:

【参考方案1】:

我认为您需要创建一个launch agent,它使用DiskArbitration framework 来监视正在安装的新磁盘。当用户登录时,此代理将设置为在后台运行。当您的助手检测到已安装新磁盘时,它可以检查代表磁盘的DADiskRef 的属性,以确定您的应用程序是否对它感兴趣。如果是,它可以使用LaunchServices API 启动应用程序的面向用户的部分。

使用 DiskArbitration 注册磁盘挂载事件的代码草图如下:

#include <Foundation/Foundation.h>
#include <DiskArbitration/DiskArbitration.h>

static void diskAppearedCallback(DADiskRef disk, void* context)

    CFDictionaryRef description = DADiskCopyDescription(disk);
    NSLog(@"Disk appeared: %@", description);
    CFRelease(description);


int main(int argc, char **argv)

    DASessionRef session = DASessionCreate(kCFAllocatorDefault);
    DARegisterDiskAppearedCallback(session, kDADiskDescriptionMatchVolumeMountable, diskAppearedCallback, 0);
    DASessionScheduleWithRunLoop(session, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);

    CFRunLoopRun();

    return 0;

DADiskCopyDescription 返回的字典包含许多属性,您可能会发现这些属性有助于确定新安装的磁盘是否感兴趣,包括媒体是否可移动、可弹出等。

【讨论】:

嘿bdash!感谢您的回答......这肯定会帮助我朝着正确的方向前进。我一有结果就会回来。再次非常感谢!! :)

以上是关于Qt 4.8 - 在 mac-mini (OS X Lion) 上检测 sd 卡的插入和移除的主要内容,如果未能解决你的问题,请参考以下文章

MAC OS X 10.8 上的 gcc 4.8 抛出“架构 x86_64 的未定义符号:”

在 OS X 上安装 Qt 库

Qt5 和 Qt 4.8 中的模型和角色

在 moveToThread() 之后未调用 Qt 4.8 信号/插槽

在 Mac Os X 上使用 CGEvent 和 Qt

在 Mac OS X 上安装多个版本的 Qt