Qt 4.8 - 如何在 Mac-mini (OS X Lion) 上检测 SD 卡的插入和拔出

10

我完全是Mac应用程序开发的新手。我只使用了Qt开发了2-3个应用程序,没有使用过objective-c/cocoa/xcode。

在Qt 4(具体为4.8)中是否有一种方法可以检测到SD卡何时插入Mac mini(OS X Lion)?

我在网上和StackOverflow上进行了很多搜索-虽然有一些结果-但都是关于Android和Windows的,与Mac(mini OS X Lion)无关。

到目前为止,我找到了这个:

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

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

如果您可以指点我正确的方向,我将不胜感激。
先谢谢了!!


更新:

我进一步研究并发现:

  • 在Linux上,我们可以使用udev(libudev)来实现此类事情。
  • 但我发现udev是Linux专属的,无法在OS X中找到
    答案在这里建议使用diskutil activity命令来持续监视磁盘的挂载或弹出。
    我在这里这里找到了非常相似的内容,但是它们是针对Linux使用udev规则的:(
  • 最新且似乎最相关的发现是:
    • diskutil plistIOKit(DiskArbitration)必须成为我寻求的解决方案的一部分。
  • 最后,在这里我了解到了关于launchd plistLingon的信息。
  • 现在...我拥有比昨天更多的东西,但我仍然需要帮助将所有这些内容整合在一起,并在Qt应用程序中使用它。我非常感谢有人指导我到最终结果。如果我真的能够创建出有用的东西,我会继续努力并更新。

    提前致谢!:)

    1个回答

    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;
    }
    
    DADiskCopyDescription返回的字典包含许多属性,您可能会发现这些属性在确定新挂载的磁盘是否有用时非常有用,包括介质是否可移动、可弹出等等。请注意保留HTML标签。

    1
    嘿bdash!感谢你的回答...这肯定会帮助我朝着正确的方向前进。一旦我有了结果,我会尽快回来。再次非常感谢!!:) - zeFree

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接