Qt 4.8 - 检测mac-mini上的SD卡的插入和删除(OS X Lion)

zeF*_*ree 10 macos notifications qt4 sd-card qt4.8

我非常擅长在Mac上开发应用程序.在这里,我使用Qt开发了2-3个应用程序,没有使用objective-c/cocoa/xcode.

有没有办法在Qt 4(4.8具体)中检测SD卡插入Mac mini(OS X Lion)的时间?

我(重新)在网络上以及在stackoverflow上搜索了很多 - 并且出现了一些结果 - 但是对于Android和Windows都没有 - 与Mac(迷你OS X Lion)无关.

直到现在我发现了这个:

  • 在Mac(迷你)上,读卡器的处理方式与任何其他USB设备一样
  • 我还在Mac Developer Library中找到了这个例子.我希望所有人都可以访问此链接.
    这个例子......"演示了当USB设备连接到系统或从系统中删除时,使用IOKitLib和IOUSBLib来设置异步回调".因此它是可以实现的.
    我想在Qt中做同样的事情.

我想检测插入SD卡的时间,然后我想显示我的应用程序,获取一些输入并将所选文件从卡移动到本地磁盘.
显然,一切都很简单 - 只需检测卡片并显示应用程序(从托盘或最小化状态)是重要而艰难的部分.

如果你能指出我正确的方向,我真的很感激.
提前致谢!!


更新:

我进一步研究并发现:

  • 在Linux上我们可以udev(libudev)用来实现这样的事情.
  • 但后来我发现udev是特定于Linux的,在OS X中找不到.这里的
    答案建议.我在这里这里发现了一些非常类似的东西,但对于使用udev规则的Linux :use the diskutil activity command to continuously monitor disks being mounted or ejected
  • 最新且看似最相关的发现是:
    • diskutil plist并且IOKit(DiskArbitration)必须成为我寻求的解决方案的一部分
  • 最后,在这里我发现了launchd plistLingon

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

提前致谢!!:)

bda*_*ash 4

我认为您需要创建一个启动代理,使用DiskArbitration 框架来监视正在安装的新磁盘。该代理将设置为在用户登录时在后台运行。当您的帮助程序检测到安装了新磁盘时,它可以检查代表该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;
}
Run Code Online (Sandbox Code Playgroud)

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